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

Cod*_*ver 4 ruby python floating-point erlang haskell

我试过了

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
Run Code Online (Sandbox Code Playgroud)

结果是一样的.为什么?

Tik*_*vis 16

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

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

?> 22/7 :: Rational
22 % 7
Run Code Online (Sandbox Code Playgroud)

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

另一种可能的代表性,定点数它有一个较小的范围比浮点数但确实保持精度的一个更好的工作该范围.(我在这里真的很多细节.)你也可以在Haskell中尝试这些:

?> import Data.Fixed
?> 22/7 :: Deci
3.1
?> 22/7 :: Centi
3.14
?> 22/7 :: Micro
3.142857
Run Code Online (Sandbox Code Playgroud)

  • 不仅因为它们共享相同的表示形式,而且因为它们共享相同的方式来打印将被正确舍入到相同浮点的最短十进制表示. (3认同)