【问题标题】:High precision floating point numbers in Haskell?Haskell中的高精度浮点数?
【发布时间】:2013-06-01 23:23:13
【问题描述】:

我知道 Haskell 有本地数据类型,它允许你拥有非常大的整数,所以像

>> let x = 131242358045284502395482305
>> x
131242358045284502395482305

按预期工作。我想知道是否可以使用类似的“大精度浮点”本机结构,所以像

>> let x = 5.0000000000000000000000001
>> x
5.0000000000000000000000001

有可能。如果我在 Haskell 中输入它,如果超过 15 位小数(双精度),它会截断为 5。

【问题讨论】:

  • 好吧,Data.Ratio 中总是有 Rational 用于任意精度分数。但一般来说,答案取决于您需要它支持哪些操作。
  • 我想Rational 不适合您的目的,即您需要Floating 实例?
  • 为了尽可能高的精度:haskell.org/haskellwiki/Exact_real_arithmetic(AERN 实施已经有一段时间没有工作了......我不知道现在是否还有其他候选人)

标签: haskell precision


【解决方案1】:

具体取决于您要查找的内容:

  • FloatDouble - 几乎所有其他语言的 Floats 和 Doubles 中您所知道和“喜爱”的内容。
  • RationalRatioIntegers
  • FixedPoint - 这个包提供任意大小的定点值。例如,如果您想要一个由 64 个整数位和 64 个小数位表示的数字,您可以使用FixedPoint6464。如果您想要一个 1024 个整数位和 8 个小数位的数字,请使用 $(mkFixedPoint 1024 8) 生成类型 FixedPoint1024_8
  • 编辑:是的,我刚刚了解了上面提到的 numbers 包 - 非常酷。

【讨论】:

  • Data.Fixed 中还有base
  • 还有一个用于cyclotomic numbers 的库,它仍然是精确的,包括所有有理数等等,并且比可计算实数有更多的可判定谓词。
【解决方案2】:

Haskell 没有原生的高精度浮点数。

对于用于此目的的包/模块/库,我会参考this answer to another post。还有一个例子展示了如何使用这个包,叫做 numbers

【讨论】:

  • 我不确定这个包是否完全符合您的要求。只是检查一下。 ;)
  • 也看看hmpfr package
【解决方案3】:

如果您需要高精度 /fast/ 浮点计算,您可能需要使用 FFI 和 long doubles,因为尚未实现原生 Haskell 类型(请参阅 https://ghc.haskell.org/trac/ghc/ticket/3353)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多