Почему 0.1 + 0.2 не равно 0.3: анатомия ошибок с плавающей запятой
Adding Floating-Point Decimals for Fun and Profit
Автор разбирает, почему сложение десятичных чисел с плавающей запятой даёт неожиданные результаты, и показывает, как ошибки округления образуют красивые фрактальные узоры. На примере 0.1 + 0.2 объясняется, как работает IEEE double-precision, откуда берётся ulp и почему Python выводит 0.30000000000000004. Анализируется общий случай сложения денежных сумм и доказывается, что результат может отличаться от точного не более чем на один ulp.
Многие знают, что не стоит выполнять десятичные вычисления, например с долларами и центами, используя числа с плавающей запятой в большинстве языков программирования. Это потому, что десятичные числа не могут быть точно выражены такими числами, и вы столкнётесь с ошибками округления.