如何计算Haskell中的浮点数?

时间:2015-10-16 02:17:29

标签: haskell floating-point

我想计算0.2 * 0.2,但结果不是0.04

>0.2 * 0.2
4.000000000000001e-2

我知道这种情况发生在任何编程语言中。 我想知道在Haskell中计算浮点数的最常用方法是什么?

与Java中的BigDecimal类似,

BigDecimal result = new BigDecimal("0.2").multiply(new BigDecimal("0.2"));
double value = result.doubleValue();

Haskell有这样的功能或技巧吗?

2 个答案:

答案 0 :(得分:3)

这就是浮点运算的工作原理(在任何语言中,而不仅仅是Haskell),所以你不需要浮点数。例如,请参阅this question

您可以使用Data.Ratio中的Rational来处理完全有理数的数字:

ghci> import Data.Ratio
ghci> 0.2 :: Rational
1 % 5
ghci> 0.2 * 0.2 :: Rational
1 % 25

如果要将其转换回浮点(由于浮点的性质,也可能导致浮点错误),您可以使用Numeric中的fromRat:< / p>

ghci> import Numeric
ghci> fromRat ((0.2 * 0.2) :: Rational)
4.0e-2

关于Haskell的数字文字

的附注

这不是强制转换(Haskell没有强制转换,至少在这种意义上没有)。数字文字被重载,因此它们可以采用任何类型Num类型的实例。现在没有必要完全理解这一点,但在某些方面了解和研究是很好的。

答案 1 :(得分:2)

除了 Rational 类型之外,您还可以查看numbers包。

特别是,有两种类型可能是有意义的:

  • BigFloat 类型 - 允许您选择精度
  • 固定类型 - 允许您选择小数位数
  • CReal 类型,用于可构造实数的精确表示

要调查的其他软件包: