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

Python why is 10e26 != 10**26 ? (Floating point inaccuracy?)

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

>>> 10**26
100000000000000000000000000

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

>>>int(10e26)
1000000000000000013287555072

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

10^26 超过了最大整数大小所以我也想知道 python 中是否有任何机制可以允许按顺序使用科学格式的数字(不考虑所有这些零)能够计算超过最大大小的数字的操作。

简短的回答是 10e2610**26 而不是 代表相同的值。

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

另一方面,

10e26 是一个 float 字面值,因此结果值受限于您机器上 float 类型的有限精度。 int(10e26)的结果是float最接近实数的整数值1027.

10e26表示十次十的26次方,即1027.

10**26代表10的26次方,1026.

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

但是,如果我们更正错误,因此我们通过评估 1e26 == 10**26 来比较 1e2610**26,我们会因为不同的原因得到 false:

  • 1e26 以有限精度浮点格式计算,在大多数实现中生成 100000000000000004764729344。 (Python 对浮点格式不严格。)100000000000000004764729344 是使用 53 个有效位最接近 1026 的值。
  • 10**26 用整数运算求值,得到 100000000000000000000000000.
  • 比较它们报告它们是不同的。

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