我有下一个二次方程的代码:
if b^2-4*a*c<0
disp('No real solutions')
elseif a==0
x=-c/b
elseif abs(b)==sqrt(b^2-4*a*c)
w = b+sign(b)*sqrt(b^2-4*a*c);
x1 = -w/(2*a)
x2 = -(2*c)/w
else
x1=(-2*c)/(b+sqrt(b^2-4*a*c))
x2=(-2*c)/(b-sqrt(b^2-4*a*c))
end
但是在某些情况下b
等于sqrt(b^2-4*a*c)
时,Matlab并不认识我,例如x^2 -100000001+1
,但等式是真的:abs(-100000001)= sqrt((-100000001)^2-4*1*1)
。
我应该改变什么因为Matlab在这些极端情况下认识到我是平等的?
答案 0 :(得分:0)
由于数值精度有限,Matlab可能会引入一些小错误。因此,通常更好的是包含一些容差。例如,
tol = 1e-5;
...
if abs(b-sqrt(b^2-4*a*c))<tol,
% It is considered that both are equal
...
end