Поскольку 1.1
и 3.3
являются числами с плавающей запятой . Десятичные дроби, такие как .1 или .3, не могут быть точно представлены в двоичном числе с плавающей запятой. .1 означает 1/10. Чтобы представить это в двоичном виде, где каждая дробная цифра представляет 1/2 n (1/2, 1/4, 1/8 и т. Д.), Вам потребуется бесконечное количество цифр, 0,000110011 ... повторяется бесконечно.
Это точно такая же проблема, как, например, представление 1/3 в базе 10. В базе 10 вам понадобится бесконечное число цифр .33333 ... навсегда, чтобы точно представить 1/3. Таким образом, работая в базе 10, вы обычно округляетесь до чего-то вроде 0,33. Но если вы добавите три копии этого, вы получите 0,99, а не 1.
Для получения более подробной информации по этой теме читайте Что должен знать каждый учёный-компьютерщик об арифметике с плавающей запятой .
Для более точного представления рациональных чисел в Haskell вы всегда можете использовать рациональный тип данных, Ratio
; в сочетании с бигнумами (произвольно большими целыми числами, Integer
в Haskell, в отличие от Int
, которые имеют фиксированный размер) в качестве типа для числителя и знаменателя, вы можете представлять произвольно точные рациональные числа, но со значительно меньшей скоростью, чем с плавающей запятой числа, которые реализованы аппаратно и оптимизированы по скорости.
Числа с плавающей запятой - это оптимизация для научных и численных расчетов, которая компенсирует точность для высокой скорости, позволяя вам выполнять очень большое количество вычислений за короткое время, если вы знаете о округлении и о том, как оно влияет на ваши вычисления.