如何在Haskell中计算浮点数?
我想计算如何在Haskell中计算浮点数?,haskell,floating-point,Haskell,Floating Point,我想计算0.2*0.2,但结果不是0.04 >0.2 * 0.2 4.000000000000001e-2 我知道这在任何编程语言中都会发生。 我想知道在Haskell中,wulod是计算浮点数最常用的方法是什么 就像Java中的BigDecimal一样 BigDecimal result = new BigDecimal("0.2").multiply(new BigDecimal("0.2")); double value = result.doubleValue(); Haske
0.2*0.2
,但结果不是0.04
>0.2 * 0.2
4.000000000000001e-2
我知道这在任何编程语言中都会发生。
我想知道在Haskell中,wulod是计算浮点数最常用的方法是什么
就像Java中的BigDecimal一样
BigDecimal result = new BigDecimal("0.2").multiply(new BigDecimal("0.2"));
double value = result.doubleValue();
Haskell有这样的功能或技巧吗 这就是浮点运算的工作原理(在任何语言中,不仅仅是Haskell),所以您不需要浮点运算。例如,请参见 您可以使用中的
Rational
来处理精确的有理数:
ghci> import Data.Ratio
ghci> 0.2 :: Rational
1 % 5
ghci> 0.2 * 0.2 :: Rational
1 % 25
如果要将其转换回浮点(由于浮点的性质,也可能导致浮点错误),可以使用fromRat
from:
关于Haskell数字文字的旁注
这不是铸造(哈斯克尔没有铸造,至少在这个意义上不是)。数值文本是重载的,因此它们可以采用作为
Num
type类实例的任何类型。现在没有必要完全理解这一点,但了解和研究某一点是很好的。这就是浮点算术的工作原理(在任何语言中,不仅仅是Haskell),所以您不需要浮点运算。例如,请参见
您可以使用中的Rational
来处理精确的有理数:
ghci> import Data.Ratio
ghci> 0.2 :: Rational
1 % 5
ghci> 0.2 * 0.2 :: Rational
1 % 25
如果要将其转换回浮点(由于浮点的性质,也可能导致浮点错误),可以使用fromRat
from:
关于Haskell数字文字的旁注
这不是铸造(哈斯克尔没有铸造,至少在这个意义上不是)。数值文本是重载的,因此它们可以采用作为
Num
type类实例的任何类型。现在没有必要完全理解这一点,但是在某一点上了解和研究是很好的。除了Rational类型之外,您还可以查看包
特别值得注意的是,有两种类型:
- BigFloat类型-允许您选择精度
- 固定的类型-允许您选择小数位数
- 可构造实数精确表示的CReal类型
- 在基地
- BigFloat类型-允许您选择精度
- 固定的类型-允许您选择小数位数
- 可构造实数精确表示的CReal类型
- 在基地
0.2
的二进制64号的二进制64乘积本身就是表示为4.00000000000000 1E-2
的二进制64号。这是计算浮点数。如果Haskell确实有类似BigDecimal的东西,您预计1/3*3的结果会是什么?您可以做的最简单的事情是在打印时将整数转换为0.0012399999???
到0.00124
并与差值进行比较。如果需要精确的数字形式,请使用任意精度的基于字符串的大十进制数字库(或自己编写一个)。是的,表示为0.2
的二进制64数字的二进制64乘积本身就是表示为4.00000000000000 1E-2
的二进制64数字。这是计算浮点数。如果Haskell确实有类似BigDecimal的东西,您预计1/3*3的结果会是什么?您可以做的最简单的事情是在打印时将整数转换为0.0012399999???
到0.00124
并与差值进行比较。如果您需要精确的数字形式,请使用任意精度的基于字符串的大十进制数库(或自己编写一个库)。是否有一个很好的函数用于将有理数转换为最接近的n位或小数点后n位或任何表示形式?或者必须手动完成吗?是否有任何函数可以将RealFloat转换为n-dgit格式的字符串?是否有一个很好的函数可以将有理数转换为最接近的n位或小数点后n位或其他表示形式?还是必须手工完成?是否有任何函数可以将RealFloat转换为n-dgit格式的字符串?这是一个很好的资源列表。我看不到一个合适的地方,所以,很遗憾:-/这是一个可爱的资源列表。我找不到合适的地方,所以,很遗憾:-/