我试图在python中处理一些相当大的数字,并遇到溢出错误。我决定进行更多调查,并遇到无法解释的不平等现象。 当我评估10 ^ 26时,我得到:
>>> 10**26
100000000000000000000000000
这是完全合乎逻辑的。但是,当我评估10e26并将其转换为int时,我得到:
>>>int(10e26)
1000000000000000013287555072
这是为什么? 我不能正确理解e符号吗? (据我所知10e26是10 * 10 ^ 26,如该答案所示:10e notation used with variables?)
10 ^ 26超出了最大整数大小,所以我还想知道python中是否有任何机制可以允许以科学格式处理数字(不考虑所有那些零)以便能够计算运算数字超过最大大小。
答案 0 :(得分:4)
简短的答案是10e26
和10**26
表示相同的值。
10**26
(两个操作数均为int
值)的取值为int
。由于int
表示任意精度的整数,因此其值精确地为 10 26 。
10e26
是float
文字,因此,结果值受计算机上float
类型的有限精度的限制。 int(10e26)
的结果是最接近实数10 27 的float
的整数值。
答案 1 :(得分:3)
10e26
代表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,并且比较返回true。)