任务是在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)
现在,这给出了结果。然而,当遇到关于代码的“健壮性”以防止除以零、不必要的溢出和下溢、取消时,我如何修改代码?对于第一种情况,除以零,我的代码已经起作用了,但是他们所说的下溢/溢出意味着什么呢?
发布于 2019-01-07 08:02:10
当编程中的值开始占用额外和意外的内存单元时,就会发生溢出/下溢。在这种情况下,程序会遇到运行时错误,或者有时关闭自身以防止对系统的损害。为了避免这种严重的情况,应该管理程序退出或返回坏值函数或在需要时执行错误的代码。当然,这应该使用if-命令、返回或破坏或而循环来完成。
附注:你的程序还存在缺陷。当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
发布于 2019-01-07 04:25:42
假设我有一个变量,它是一个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位.那么,当你得到一个很大的数字输入,然后对它进行数学运算时,会发生什么呢?它会因为你的碎片用完而溢出吗?还是潜流?
FYI:如果你不懂二进制,你应该快速查看wiki来帮助解决,因为任何计算机语言中的所有数字都将被表示为位,但幸运的是,我们处理十进制值。
还有,有人在这里挥手。
https://stackoverflow.com/questions/54059001
复制相似问题