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

时间:2019-01-24 18:29:55

标签: python floating-point notation

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

>>> 10**26
100000000000000000000000000

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

>>>int(10e26)
1000000000000000013287555072

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

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

2 个答案:

答案 0 :(得分:4)

简短的答案是10e2610**26表示相同的值。

10**26(两个操作数均为int值)的取值为int。由于int表示任意精度的整数,因此其值精确地为 10 26

另一方面,

10e26float文字,因此,结果值受计算机上float类型的有限精度的限制。 int(10e26)的结果是最接近实数10 27 float的整数值。

答案 1 :(得分:3)

10e26代表10的十倍乘以26的幂,即10 27

10**26代表10到26的幂,即10 26

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

但是,如果我们纠正了错误,因此我们通过评估1e26来比较10**261e26 == 10**26,则由于其他原因,我们会得到假:

  • 1e26以有限精度的浮点格式进行评估,在大多数实现中产生100000000000000004764729344。 (Python对浮点格式不严格。)100000000000000004764729344是最接近的可以使用53个有效位达到10 26 的地方。
  • 10**26用整数算术求值,产生100000000000000000000000000。
  • 比较它们报告它们是不同的。

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