Высокоточные числа с плавающей запятой в Haskell?
Я знаю, что у Haskell есть собственные типы данных, которые позволяют иметь действительно большие целые числа, поэтому такие вещи, как
>> let x = 131242358045284502395482305
>> x
131242358045284502395482305
работает как ожидалось. Мне было интересно, существует ли подобная "большая точность float", которую я могу использовать, поэтому такие вещи, как
>> let x = 5.0000000000000000000000001
>> x
5.0000000000000000000000001
может быть возможно. Если я введу это в Haskell, он усекает до 5, если я выйду за пределы 15 знаков после запятой (двойная точность).
Ответы
Ответ 1
В зависимости от того, что вы ищете:
-
Float
и Double
- в значительной степени то, что вы знаете и "любите" от Floats and Doubles на всех других языках.
-
Rational
, который является Ratio
of Integer
s
-
FixedPoint
- Этот пакет предоставляет значения фиксированной точки произвольного размера. Например, если вы хотите число, которое представлено 64 целыми битами и 64 дробными битами, вы можете использовать FixedPoint6464
. Если вы хотите число, равное 1024 интегральным битам и 8 дробным битам, используйте $(mkFixedPoint 1024 8)
для генерации типа FixedPoint1024_8
.
- EDIT: И да, я только что узнал о пакете
numbers
, упомянутом выше - очень круто.
Ответ 2
Haskell не имеет высокоточных чисел с плавающей запятой naitively.
Для пакета/модуля/библиотеки для этой цели я буду ссылаться на этот ответ на другое сообщение. Также есть пример, который показывает, как использовать этот пакет, называемый numbers.
Ответ 3
Если вам нужны вычисления с высокой точностью/быстрой/с плавающей точкой, вам может потребоваться использование FFI и длинных удвоений, так как собственный тип Haskell еще не реализован (см. https://ghc.haskell.org/trac/ghc/ticket/3353).