Python 为什么是 10e26 != 10**26 ?(浮点不准确?)

我试图在 python 中处理一些相当大的数字,但遇到了溢出错误。我决定进行更多调查,但发现了一个我无法解释的不平等。当我评估 10^26 时,我得到:


>>> 10**26

100000000000000000000000000

这是完全合乎逻辑的。但是,当我评估 10e26 并将其转换为 int 时,我得到:


>>>int(10e26)

1000000000000000013287555072

为什么是这样?我没有正确理解 e 符号吗?(据我所知,10e26 是 10*10^26,如这个答案所示:10e notation used with variables?)


10^26 远远超过最大整数大小,所以我还想知道 python 中是否有任何机制可以允许以科学格式处理数字(不考虑所有这些零),以便能够计算过去的数字操作最大尺寸。


慕仙森
浏览 183回答 2
2回答

HUWWW

简短的回答是,10e26和10**26你不能代表相同的值。10**26,两个操作数都是int值,计算结果为int。Asint表示具有任意精度的整数,它的值正好是预期的10 26。10e26,另一方面,是一个float文字,因此结果值受float机器上类型的有限精度的影响。的结果int(10e26)是float最接近实数 10 27的整数值。

月关宝盒

10e26表示 10 次 10 的 26 次方,即 10 27。10**26代表 代表 10 的 26 次方, 10 26。显然,这些是不同的,所以10e26 == 10**26是假的。但是,如果我们纠正错误,因此我们比较1e26并10**26通过评估1e26 == 10**26,我们会因为不同的原因得到错误:1e26以有限精度的浮点格式计算,在大多数实现中产生 100000000000000004764729344。(Python 对浮点格式并不严格。) 100000000000000004764729344 是使用 53 个有效位可以得到的最接近 10 26 的值。10**26 用整数算法计算,产生 100000000000000000000000000。比较他们报告他们是不同的。(我不确定 Python 语义,但我认为它会将浮点值转换为扩展精度整数以进行比较。如果我们将整数转换为浮点数float(10**26) == 1e26,则 100000000000000000000000000 的转换float会产生相同的值, 100000000000000004764729344,比较结果为真。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python