Python

Почему 1+eps != 1+eps+eps/2 не равны, eps - машинный эпсилон?

По определению: 1+eps!=1 и 1+eps/2==1
Коло Цинт
Коло Цинт
1 238
Машинные вычисленя с плавающей точкой лучше всего описываются теорией приближённых вычислений. Хотя она в современных ИТ не в моде, но от этого не перестаёт быть верной. И в ней A + B - B вполне может быть не равно A, а A + B вполне может быть равно A при ненулевом B, если при вычислениях теряется точность. И при повторении операций накапливается погрешность в полном соответствии с теорией: A + B + B + B может не быть равным A + 3 * B.

В машинных типах с плавающей точкой числа представлены в виде мантиссы (конечной двоичной дроби, например, 0.1110101) и порядка. Например, 32-битный тип IEEE гарантирует 7 десятичных цифр, а 64-битный - 15. Всё, что сверх этого, отбрасывается, и никакой Питон не спасёт.

Кроме того, конечные десятичные дроби редко можно представить в виде конечных двоичных дробей. Например, десятичное 0.1 в двоичной системе будет бесконечной дробью, а машина хранит только конечное число разрядов, поэтому уже до начала вычислений мы имеем неточное представление числа.

В Питоне есть тип Decimal из библиотеки decimal (кажется). Это - представление числа в виде десятичных цифр до и после запятой. В пределах точности (она регулируется параметрами) любая конечная десятичная дробь будет представлена точно. Но за это придётся заплатить скоростью вычислений.
Виктор Макеров
Виктор Макеров
54 053
Лучший ответ
Что такое "машинный эпсилон" применительно к Питону с его встроенной произвольной точностью вычислений, уточни пожалуйста...
Андрей Бондаренко В Python только целочисленные неограниченной длины. А вещественные - стандартный FPU'шный float64.
операции с плавающей точкой ограничены точностью представления
Раджан Сатпаев
Раджан Сатпаев
80 315