Повышение робастности квадратного уравнения в Matlab - PullRequest
0 голосов
/ 06 января 2019

Задача состояла в том, чтобы написать код в 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 голосов
/ 07 января 2019

Переполнение / переполнение происходит, когда значение в программировании начинает занимать дополнительные и неожиданные ячейки памяти. В этом случае программа сталкивается с ошибкой времени выполнения или иногда отключается, чтобы предотвратить повреждение системы. Чтобы избежать таких серьезных случаев, программа должна управляться для выхода или возврата из некорректной функции или неправильного выполнения кода, когда это необходимо. Это, конечно, должно быть сделано с помощью команд if-else , return или break или , в то время как loop.

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
0 голосов
/ 07 января 2019

Допустим, у меня есть переменная, которая является 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-битные. Так что же происходит, когда вы получаете ввод большого числа и выполняете на нем математику? Будет ли он переполнен, потому что у вас закончились биты? или недостаточный?

К вашему сведению: если вы не знаете двоичный код, вам следует быстро взглянуть на вики, чтобы выручить, потому что все цифры на любом языке компьютера будут выражаться в битах, но, к счастью, мы имеем дело с десятичными значениями.

Кроме того, здесь махают рукой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...