Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Haskell中计算浮点数?_Haskell_Floating Point - Fatal编程技术网

如何在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类型
其他需要调查的包:

  • 在基地

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

特别值得注意的是,有两种类型:

  • 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格式的字符串?这是一个很好的资源列表。我看不到一个合适的地方,所以,很遗憾:-/这是一个可爱的资源列表。我找不到合适的地方,所以,很遗憾:-/