IEEE 754 с плавающей точкой
Может ли кто-нибудь объяснить мне, почему они не равны в IEEE 754:
(1 + 1e300) - 1e100 and 1 + (1e300 - 1e100)
Большое спасибо!
1 ответ
Это зависит от того, в каком именно формате IEEE вы работаете, и в режиме округления, который вы используете.
F64
Комментарии выше, в которых говорится, что они равны, скорее всего, проверяют это, по крайней мере, с двойной (двоичной) точностью F64, например, с округлением RNE. Это то, что обычно происходит при использовании double
на C-подобных языках.
В этом случае все ваши числа будут преобразованы и округлены до значения F64. Другие числа настолько далеки от 1e300, что любое добавление округляется до 1e300. Чтобы отобразить это число в десятичных числах, оно снова округляется и отображается как 1e300.
Если ваш режим округления не RNE, ваши окончательные ответы могут немного отличаться от 1e300, хотя все еще, вероятно, равны.
F32
Однако, если вы работаете с одинарной (F32) точностью - большинство ваших чисел слишком велики, чтобы их представлять, и, скорее всего, они будут преобразованы в Inf
,
Следуя правилам IEEE 745: вы в итоге рассчитываете Inf-Inf
в обоих случаях, что должно привести к NaN
, И наконец, если вы в конечном итоге сравниваете значения как числа с плавающей точкой: NaN==NaN
ответ должен быть false
что соответствует тому, что вы видите.
Для Python
>>> (1 + 1e300) - 1e100 == 1 + (1e300 - 1e100)
True