为什么编程语言会同等地限制22/7的精度?

时间:2015-05-12 21:36:58

标签: python ruby haskell floating-point erlang

我试过

Erlang
$ erl
1> Pi = 22/7.
3.142857142857143

Haskell
$ ghci 
Prelude> 22/7
3.142857142857143

Python
$ python
>>> 22/7.0
3.142857142857143

Ruby 
$ irb
2.1.6 :001 > 22 / 7.0
 => 3.142857142857143

结果是一样的。为什么呢?

1 个答案:

答案 0 :(得分:16)

这是因为所有语言对非整数使用相同的数字表示:IEEE 754 floating point numbers,很可能是相同的精度级别。 (32位“浮点数”或64位“双打”,具体取决于系统和语言的配置方式。)

浮点数是此类操作的默认选择,很大程度上是因为它们直接支持硬件。然而,从根本上说,没有什么能阻止语言支持其他类型的数字。这在Haskell中最容易演示,Haskell在其标准库中具有有理数:

λ> 22/7 :: Rational
22 % 7

有理数是一个分数,因此它存储为一对整数,并且在分割时不会失去任何精度。与此同时,某些操作比使用普通浮点数更困难,效率更低。

另一种可能的表示是fixed-point numbers,其范围小于浮点数,但在范围内保持精度的效果更好。 (我在这里真的很多细节。)你也可以在Haskell中尝试这些:

λ> import Data.Fixed
λ> 22/7 :: Deci
3.1
λ> 22/7 :: Centi
3.14
λ> 22/7 :: Micro
3.142857