首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么4种不同的语言在这里给出了4种不同的结果?

为什么4种不同的语言在这里给出了4种不同的结果?
EN

Stack Overflow用户
提问于 2016-08-23 11:54:05
回答 3查看 246关注 0票数 5

考虑这一点(在64位Arch Linux系统上运行的所有命令):

  • Perl (v5.24.0) $ perl -le 'print 10190150730169267102/1000%10‘6
  • awk (GNU Awk 4.1.3) $ awk‘print{print 10190150730169267102/1000%10}’6
  • R (3.3.1)(10190150730169267102/1000)%10 1 6
  • bc $ echo 10190150730169267102/1000%10 % bc 7
  • Python2 (2.7.12)打印(10190150730169267102/1000%10)7
  • Python3 (3.5.2)打印(10190150730169267102/1000%10) 8.0

因此,Perl、gawkR都同意,bc和Pyhun2也是如此。然而,在测试的6种工具之间,我得到了4种不同的结果。我知道这与整数被四舍五入的长度有关,但是为什么不同的工具会有如此大的差异呢?我原以为这将取决于处理器处理大量数字的能力,但它似乎取决于语言的内部特性(或bug)。

有人能解释一下幕后发生了什么吗?每种语言的局限性是什么?为什么它们表现得如此不同?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-23 17:01:27

你看到不同的结果有两个原因:

  1. 除法步骤是做两件不同的事情:在您尝试过的一些语言中,它表示整数除法,它丢弃结果的小数部分,只保留整数部分。在另一些情况下,它表示实际的数学除法(按照Python的术语,我将在下面称之为“真除法”),返回接近真商的浮点结果。
  2. 在某些语言(支持任意精度的语言)中,大型分子值10190150730169267102被精确地表示;在另一些语言中,它被最近可表示的浮点值所取代。

以上第1和第2段中各种可能性的不同组合给出了不同的结果。

详细说明:在Perl、awk和R中,我们使用浮点值和真正的除法。值10190150730169267102太大,无法存储在机器整数中,因此它以通常的IEEE 754 binary64浮点格式存储。该格式不能准确地表示特定的值,因此存储的是在该格式中可表示的最接近的值,即10190150730169266176.0。现在我们用1000除以这个近似,再一次给出一个浮点结果。确切的商数,10190150730169266.176,同样不能用binary64格式表示,我们得到了最接近可表示的浮点,它恰好是10190150730169266.0。取余数模10给出6

在bc和Python 2中,我们使用任意精度整数和整数除法.这两种语言都可以精确地表示分子。除法结果是10190150730169267 (我们正在进行整数除法,而不是真除法,因此小数部分被丢弃),剩余的模107。(这有点过于简化了: bc内部使用的格式更接近于Python的Decimal类型,而不是任意精度的整数类型,但在这种情况下效果是相同的。)

在Python 3中,我们使用任意精度的整数和真除法。分子被精确地表示,但是除法的结果是与真商最近的浮点值。在这种情况下,确切的商数是10190150730169267.102,最近可表示的浮点值是10190150730169268.0。以该值的其余部分为模,10给出8

摘要:

  • Perl,awk,R:浮点逼近,真除法
  • bc,Python 2:任意精度整数,整数除法
  • Python 3:任意精度整数,真除法
票数 9
EN

Stack Overflow用户

发布于 2016-08-23 12:14:59

我只能回答python 2和python 3之间的区别。"/“是python 2中的整数除法,而python 3中是实数除法(这是python 3中的.0的来源)。输出是浮点。

概括地说:

  • Python 2 10190150730169267102/1000%10 等于 10190150730169267%10 等于 7
  • Python 3 10190150730169267102/1000%10 等于 10190150730169267 102%10 等于 7.102

但由于内部表示,它被(错误地)计算为8.0

您可能会注意到,正确的答案可能是7或7.102,这取决于我们是否认为除法是浮点数或整数。所以只有Python(2)和bc有正确的答案。并且python3将使用整数除法(10190150730169267102//1000%10)得到正确的答案。

Python本机支持任意整数

票数 3
EN

Stack Overflow用户

发布于 2016-08-29 21:58:38

在perl6中

代码语言:javascript
复制
➜  ~  perl6 -e 'say(10190150730169267102 div 1000 mod 10)'
7
➜  ~  perl6 -e 'say(10190150730169267102/1000%10)'
7.102

因此,如果您不确定哪种语言是正确的,请询问Perl6。:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39100460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档