Для 64-битного IEEE 754 с плавающей запятой наименьшее число, такое что 1.0 + e != 1.0
равно e = 2.2204460492503131e-016
. (DBL_EPSILON
в float.h в C, std::numeric_limits<double>().epsilon()
в <limits>
в C ++). Я думаю, что маловероятно, что ваш код будет работать на любых системах, где собственный формат с плавающей запятой не является 64-битным IEEE 754.
Обратите внимание, что абсолютная точность на самом деле меняется в зависимости от величины чисел, с которыми вы имеете дело. С денормалями вы оперируете чрезвычайно малыми значениями, поэтому 1e-300 + 2e-300
будет работать, но 1 + 1e-300 == 1
. Аналогично 1e30 + 1 == 1e30
.