python中的不同结果是将整数与浮动相同的数字相乘

时间:2014-02-19 19:18:46

标签: python multiplication

尝试以两种不同的方式在python 2.7提示符中乘法109221975 * 123222821

Python 2.7.3 (default, Sep 26 2013, 20:08:41) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 109221975*123222821
13458639874691475L
>>> 109221975*123222821.0
1.3458639874691476e+16
>>> int(109221975.0*123222821.0)
13458639874691476L
>>> 109221975*123222821 == int(109221975.0*123222821.0)
False
>>> 

我怀疑这里有一些精确的不一致导致了这样的问题,是否有可能推测何时会发生不一致?

3 个答案:

答案 0 :(得分:2)

您的int长54位。 float可以包含53位有效数字,因此有效地将最后一位数舍入为偶数。

在内部,您的浮动表示为:

  

2225720309975242 * 2 -1

您的intfloat存储在二进制文件中,如下所示:

             101111110100001000111111001000111001000001000110010011
0 10000110100 0111111010000100011111100100011100100000100011001010

对于float,第一部分是符号,第二部分是指数,第三部分是有效数字 。因为为指数分配了空间,所以没有足够的空间留下有效数字

我如何对齐两个表示,你可以看到数据是相同的,但int需要一个额外的数字在右边,而float使用更多(在这种情况下浪费)空间在左边

答案 1 :(得分:1)

因为python中的int具有无限精度,但float没有。 (float是一个双精度浮点数,具有53位精度。)

答案 2 :(得分:1)

曾几何时,有一个名为st的字符串想成为一个数字。我应该说几号呢?

该字符串的神仙母亲说:好吧,如果你想成为一个准确的数字,一个用于计算整个事物的数字,我将是一个任意的精度整数:

>>> st='123456789123456789'
>>> int(st)
123456789123456789
>>> int(st)*int(st)*int(st)
1881676377434183981909562699940347954480361860897069

'但我也想算上一些东西,比如我还有的三明治!说圣。因此,公平的教母是一个浮动,但知道你可能会在一段时间后松散跟踪几个1/2三明治。事实上,在9007199254740992事之后,你可能会开始忘记一些事情,因为当你是一个浮动时你只有53个手指可以计算:

>>> float(int('1'*53,2)+1)
9007199254740992.0
>>> float(int('1'*53,2)+1)+1
9007199254740992.0

>>> int(float(int(st)))
123456789123456784
>>> int(st)-int(float(st))
5