Подтвердить что ты не робот

Высокоточные числа с плавающей запятой в Haskell?

Я знаю, что у Haskell есть собственные типы данных, которые позволяют иметь действительно большие целые числа, поэтому такие вещи, как

>> let x = 131242358045284502395482305
>> x
131242358045284502395482305

работает как ожидалось. Мне было интересно, существует ли подобная "большая точность float", которую я могу использовать, поэтому такие вещи, как

>> let x = 5.0000000000000000000000001
>> x
5.0000000000000000000000001

может быть возможно. Если я введу это в Haskell, он усекает до 5, если я выйду за пределы 15 знаков после запятой (двойная точность).

4b9b3361

Ответ 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).