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



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

>>> 10**26
100000000000000000000000000

这完全符合逻辑。然而,当我计算10e26并将其转换为int时,我得到:

>>>int(10e26)
1000000000000000013287555072

为什么会这样?我不太懂e符号吗?(据我所知,10e26是10*10^26,如这个答案所示:10e表示法与变量一起使用?)

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

简单的答案是10e2610**26不代表相同的值。

两个操作数都是int值的10**26计算为int。由于int表示具有任意精度的整数,因此其值恰好为1026

另一方面,10e26float文字,因此生成的值受机器上float类型的有限精度的限制。CCD_ 10的结果是最接近实数1027的CCD_ 11的整数值。

10e26表示10乘以26的幂,即1027

10**26表示10的26次方,1026

显然,这些是不同的,所以10e26 == 10**26是假的。

然而,如果我们纠正错误,通过评估1e26 == 10**26来比较1e2610**26,我们会因为另一个原因而得到错误:

  • 1e26以有限精度浮点格式计算,在大多数实现中产生100000000000000004764729344。(Python对浮点格式并不严格。)100000000000000004764729344是使用53个有效位最接近1026的格式
  • 10**26采用整数运算进行评估,产生100000000000000000000000000
  • 将它们进行比较表明它们有所不同

(我不确定Python的语义,但我认为它会将浮点值转换为扩展精度整数进行比较。如果我们将整数转换为浮点,则使用float(10**26) == 1e26,100000000000000000000000000到float的转换会产生相同的值100000000000000004764729344,并且比较返回true。)

相关内容

  • 没有找到相关文章

最新更新