任务是在matlab中编写代码来解决二次方程。
我的代码在下面
a=input('a= ');
b=input('b= ');
c=input('c= ');
if a==0
x=double(-c/b);
disp(x)
else
discriminant=b.^2-4*a*c;
if discriminant<0
error('Roots are not real')
else
e=sqrt(discriminant);
x1=double((-b+e)/(2*a));
x2=double((-b-e)/(2*a));
end
end
disp(x1)
disp(x2)
现在,这给出了结果。但是,当遇到有关代码的“健壮性”以防止被零除,不必要的上溢和下溢,取消的问题时,如何修改代码?对于第一种情况,除以零,我的代码已经可以工作了,但是下溢/上溢是什么意思?
答案 0 :(得分:1)
当编程中的值开始占用多余和意外的存储单元时,将发生上溢/下溢。在这种情况下,程序会遇到运行时错误,或者有时会自行关闭以防止对系统造成损害。为了避免发生这种严重情况,应在需要时管理程序退出或返回值不正确的函数或执行错误的代码。当然,应该使用 if-else 命令,返回或 break 或 while 循环来完成此操作。< / p>
p.s。您的程序仍然存在缺陷。当a = b = 0和c!= 0时,它将发生故障。我将您的代码转换为MATLAB中的函数(现在可以在“命令窗口”中调用),并添加了MAX_VALUE以避免变量越界。
这是代码
function x=quadroots(a,b,c,MAX_VALUE)
if nargin == 3
MAX_VALUE=1e50;
end
if abs(a)>MAX_VALUE||abs(b)>MAX_VALUE||abs(c)>MAX_VALUE
error('Out of bound variables')
end
if a==0 && b~=0
x=double(-c/b);
disp(x)
elseif a==0 && b==0 && c==0
error('0=0')
elseif a==0 && b==0 && c~=0
error('Infeasible solutions')
else
discriminant=b.^2-4*a*c;
if discriminant<0
error('Roots are not real')
else
e=sqrt(discriminant);
x(1)=double((-b+e)/(2*a));
x(2)=double((-b-e)/(2*a));
end
end
end
答案 1 :(得分:0)
假设我有一个2位整数的变量。现在,对于我的变量,我只能以小数形式保留2 ^ 2作为最大数。让我们看看2位是如何计数的:
0 0 (add 1) --> 0 1
0 1 (add 1) --> 1 0
1 0 (add 1) --> 1 1
1 1 (add 1) --> 0 0
它回绕到0 0
,因为我用完了几位数来保存我的数字,所以它重新开始了。这称为溢出。下溢相同,除了下溢回最大值。对于matlab,位数可以更大,例如32位或64位。那么,当您获得大量输入并对其进行数学运算时会发生什么呢?它会因为您用完所有位而溢出吗?还是下溢?
仅供参考:如果您不了解二进制,则应该快速浏览Wiki以寻求帮助,因为任何计算机语言中的所有数字都将表示为位,但是幸运的是我们处理十进制值。
另外,有人在这里挥舞着手。