Matlab использует числа с плавающей запятой двойной точности для хранения действительных чисел. Это числа вида m*2^e
, где m
- целое число от 2^52
до 2^53
( мантисса ) и e
- показатель степени. Давайте назовем число числом с плавающей запятой, если оно имеет эту форму.
Все числа, используемые в вычислениях, должны быть числами с плавающей точкой. Зачастую это можно сделать точно, как с 2
и 0.5
в вашем выражении. Но для других чисел, особенно для большинства чисел с цифрами после десятичной точки, это невозможно, и необходимо использовать приближение. В этом случае происходит то, что число округляется до ближайшего числа с плавающей запятой.
Итак, всякий раз, когда вы пишете что-то вроде 0.04
в Matlab, вы действительно говорите: «Получите мне число с плавающей точкой, которое ближе всего к 0.04
. В вашем выражении есть 2 числа, которые должны быть аппроксимированы: 0.04
и 0.4
.
Кроме того, точный результат таких операций, как сложение и умножение чисел с плавающей запятой, может не быть числом с плавающей запятой. Хотя оно всегда имеет форму m*2^e
, мантисса может быть слишком большой. Таким образом, вы получаете дополнительную ошибку при округлении результатов операций.
В конце дня простое выражение, подобное вашему, будет отключено примерно в 2 ^ -52 раз больше операндов, или примерно в 10 ^ -17.
В итоге: причина, по которой ваше выражение не оценивается как ноль, является двойной:
- Некоторые цифры, с которых вы начинаете, отличаются (приблизительными) от точных цифр, которые вы указали.
- Промежуточные результаты также могут быть приблизительными точными результатами.