为什么我的函数停止返回正确的值?

时间:2017-05-19 15:46:38

标签: python

我有一个证明((2^(2*i))-1)/3总是奇怪的,特别是当i变大时,1&5的数字似乎在1和5之间交替变换。我编写了以下python函数来进行数学运算。

def A():
    for i in range(513):
       x = int((2**(2*i)-1)/3)
       print(x)

一旦i大于28,1位的数字会在1到5之间交替停止,并在4到6之间交替开始。当然,正确的数字是不均匀的,所以I& #39;我认为计算机必须以某种方式弄乱计算。为什么要这样呢?

3 个答案:

答案 0 :(得分:4)

对于记录,如@chepner的评论中所指出的,除以3会产生浮点不精确。

int( ... / 3)替换... // 3将解决问题:

x = (2**(2*i)-1) // 3

//运算符是整数除法。

答案 1 :(得分:3)

在Python 3中,/运算符始终生成浮点值:

>>> 1/3
0.3333333333333333

与可以准确表示任何整数的int不同,浮点值具有固定的精度;你只有这么多有效数字。假设您只有3位有效数字; 10,000 / 3会给你3330而不是3333.333333333333。因此,即使在使用int函数删除任何小数部分之前,您的答案也不完全正确。

Right Leg's answer为您提供了正确的解决方法。

答案 2 :(得分:2)

让我们在临界点拆分计算,并添加一个整数除法:

for i in range(25,35):
    temp = (2**(2*i)-1)/3
    itemp = (2**(2*i)-1)//3
    print()
    print ("{0:16d}".format(itemp))
    print ("{0:16.10f}".format(temp))
    x = int(temp)
    print (x)

这使您可以在达到浮点精度限制后记录损失。输出:

375299968947541
375299968947541.0000000000
375299968947541

1501199875790165
1501199875790165.0000000000
1501199875790165

6004799503160661
6004799503160661.0000000000
6004799503160661

24019198012642645
24019198012642644.0000000000
24019198012642644

96076792050570581
96076792050570576.0000000000
96076792050570576

384307168202282325
384307168202282304.0000000000
384307168202282304

1537228672809129301
1537228672809129216.0000000000
1537228672809129216

6148914691236517205
6148914691236516864.0000000000
6148914691236516864

24595658764946068821
24595658764946067456.0000000000
24595658764946067456

98382635059784275285
98382635059784269824.0000000000
98382635059784269824