在Matlab中提高二次方程的鲁棒性

时间:2019-01-06 05:50:40

标签: matlab

任务是在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)

现在,这给出了结果。但是,当遇到有关代码的“健壮性”以防止被零除,不必要的上溢和下溢,取消的问题时,如何修改代码?对于第一种情况,除以零,我的代码已经可以工作了,但是下溢/上溢是什么意思?

2 个答案:

答案 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以寻求帮助,因为任何计算机语言中的所有数字都将表示为位,但是幸运的是我们处理十进制值。

另外,有人在这里挥舞着手。