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
Другие вопросы по тегам