考虑这一点(在64位Arch Linux系统上运行的所有命令):
awk (GNU Awk 4.1.3)
$ awk‘print{print 10190150730169267102/1000%10}’6bc
$ echo 10190150730169267102/1000%10 % bc 7因此,Perl、gawk和R都同意,bc和Pyhun2也是如此。然而,在测试的6种工具之间,我得到了4种不同的结果。我知道这与整数被四舍五入的长度有关,但是为什么不同的工具会有如此大的差异呢?我原以为这将取决于处理器处理大量数字的能力,但它似乎取决于语言的内部特性(或bug)。
有人能解释一下幕后发生了什么吗?每种语言的局限性是什么?为什么它们表现得如此不同?
发布于 2016-08-23 17:01:27
你看到不同的结果有两个原因:
10190150730169267102被精确地表示;在另一些语言中,它被最近可表示的浮点值所取代。以上第1和第2段中各种可能性的不同组合给出了不同的结果。
详细说明:在Perl、awk和R中,我们使用浮点值和真正的除法。值10190150730169267102太大,无法存储在机器整数中,因此它以通常的IEEE 754 binary64浮点格式存储。该格式不能准确地表示特定的值,因此存储的是在该格式中可表示的最接近的值,即10190150730169266176.0。现在我们用1000除以这个近似,再一次给出一个浮点结果。确切的商数,10190150730169266.176,同样不能用binary64格式表示,我们得到了最接近可表示的浮点,它恰好是10190150730169266.0。取余数模10给出6。
在bc和Python 2中,我们使用任意精度整数和整数除法.这两种语言都可以精确地表示分子。除法结果是10190150730169267 (我们正在进行整数除法,而不是真除法,因此小数部分被丢弃),剩余的模10是7。(这有点过于简化了: bc内部使用的格式更接近于Python的Decimal类型,而不是任意精度的整数类型,但在这种情况下效果是相同的。)
在Python 3中,我们使用任意精度的整数和真除法。分子被精确地表示,但是除法的结果是与真商最近的浮点值。在这种情况下,确切的商数是10190150730169267.102,最近可表示的浮点值是10190150730169268.0。以该值的其余部分为模,10给出8。
摘要:
发布于 2016-08-23 12:14:59
我只能回答python 2和python 3之间的区别。"/“是python 2中的整数除法,而python 3中是实数除法(这是python 3中的.0的来源)。输出是浮点。
概括地说:
但由于内部表示,它被(错误地)计算为8.0
您可能会注意到,正确的答案可能是7或7.102,这取决于我们是否认为除法是浮点数或整数。所以只有Python(2)和bc有正确的答案。并且python3将使用整数除法(10190150730169267102//1000%10)得到正确的答案。
Python本机支持任意大整数!
发布于 2016-08-29 21:58:38
在perl6中
➜ ~ perl6 -e 'say(10190150730169267102 div 1000 mod 10)'
7
➜ ~ perl6 -e 'say(10190150730169267102/1000%10)'
7.102因此,如果您不确定哪种语言是正确的,请询问Perl6。:)
https://stackoverflow.com/questions/39100460
复制相似问题