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

2024-10-03 11:13:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我试过了

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

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


Tags: haskellpierlangrubypreludeerlirbghci
1条回答
网友
1楼 · 发布于 2024-10-03 11:13:18

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

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

λ> 22/7 :: Rational
22 % 7

有理数是一个分数,所以它存储为一对整数,并且在除法时不会损失任何精度。同时,有些运算比普通浮点数更困难,效率更低。在

另一种可能的表示是fixed-point numbers,它的范围比浮点数小,但在保持精度方面做得更好。(我真的在这里省去了很多细节。)你也可以在哈斯凯尔试试这些:

^{pr2}$

相关问题 更多 >