Чтобы добавить к тому, что сказали другие ответы, вы можете использовать функцию MATLAB EPS , чтобы визуализировать проблему точности, с которой вы столкнулись. Для заданного числа с плавающей запятой двойной точности функция EPS сообщит вам расстояние от него до следующего наибольшего представимого числа с плавающей запятой:
>> a = 1.22e-45;
>> b = 1;
>> eps(b)
ans =
2.2204e-016
Обратите внимание, что следующее число с плавающей запятой, большее 1, равно 1.00000000000000022204 ... и значение a
даже близко не достигает половины расстояния между двумя числами. Следовательно, a+b
в итоге остается 1.
Кстати, вы также можете понять, почему a
считается ненулевым, даже если он настолько мал, если взглянуть на наименьшее представимое значение с плавающей запятой двойной точности, используя функцию REALMIN :
>> realmin
ans =
2.2251e-308 %# MUCH smaller than a!