我试图在python中处理一些相当大的数字,但遇到了溢出错误。我决定多调查一点,发现了一个我无法解释的不平等。当我评估10^26时,我得到:
>>> 10**26
100000000000000000000000000
这完全符合逻辑。然而,当我计算10e26并将其转换为int时,我得到:
>>>int(10e26)
1000000000000000013287555072
为什么会这样?我不太懂e符号吗?(据我所知,10e26是10*10^26,如这个答案所示:10e表示法与变量一起使用?)
10^26远远超过了最大整数大小,所以我也想知道python中是否有任何机制可以允许以科学格式处理数字(不考虑所有这些零),以便能够计算超过最大大小的数字的运算。
简单的答案是10e26
和10**26
不代表相同的值。
两个操作数都是int
值的10**26
计算为int
。由于int
表示具有任意精度的整数,因此其值恰好为1026。
另一方面,10e26
是float
文字,因此生成的值受机器上float
类型的有限精度的限制。CCD_ 10的结果是最接近实数1027的CCD_ 11的整数值。
10e26
表示10乘以26的幂,即1027。
10**26
表示10的26次方,1026。
显然,这些是不同的,所以10e26 == 10**26
是假的。
然而,如果我们纠正错误,通过评估1e26 == 10**26
来比较1e26
和10**26
,我们会因为另一个原因而得到错误:
1e26
以有限精度浮点格式计算,在大多数实现中产生100000000000000004764729344。(Python对浮点格式并不严格。)100000000000000004764729344是使用53个有效位最接近1026的格式10**26
采用整数运算进行评估,产生100000000000000000000000000- 将它们进行比较表明它们有所不同
(我不确定Python的语义,但我认为它会将浮点值转换为扩展精度整数进行比较。如果我们将整数转换为浮点,则使用float(10**26) == 1e26
,100000000000000000000000000到float
的转换会产生相同的值100000000000000004764729344,并且比较返回true。)