Python(Numpy和SciPy)用大整数计算

时间:2014-09-03 19:36:41

标签: python numpy integer scipy

我一直在尝试使用Python在SciPy包中使用'comb'函数来计算概率。代码如下:

p = 0
for k in np.arange(8) + 1:
    p  += comb(8,k, exact = True)*k*8**(2*(2-k))*k**(2*k)
    print(p) ## used to check the value of p in each iteration
p /= 2**59

然而,我得到了结果为nan。以下是每次迭代的p值:结果:

8.881784197e-16
2.44249065418e-15
5.76210086589e-15
1.35336620383e-14
3.16282379379e-14
-5.16631424912e-15
-5.20085316827e-15
nan

为了使它工作,我尝试在每次迭代中进行除法:

p = 0
for k in np.arange(8) + 1:
    p  += comb(8,k, exact = True)*k*8**(2*(2-k))*k**(2*k)/ 2**59
    print(p)

但是这没有用,我最后还是得到了纳:

8.881784197e-16
2.44249065418e-15
5.76210086589e-15
1.35336620383e-14
3.16282379379e-14
-5.16631424912e-15
-5.20085316827e-15
nan

我假设这是由整数的不同表示引起的:负值和nan可能是由于将Long解释为float而引起的。实际上,当我逐步进行计算时,似乎有效:

In [155]:
k = 8
comb(8,k, exact = True)*k*8**(2*(8-k))*k**(2*k) / 2**59
Out[155]:
0.00390625

In [156]:
k = 7
comb(8,k, exact = True)*k*8**(2*(8-k))*k**(2*k) / 2**59 + _
Out[156]:
0.008122931679330314

In [158]:
k = 6
comb(8,k, exact = True)*k*8**(2*(8-k))*k**(2*k) / 2**59 + _
Out[158]:
0.010721382431305493
...

知道如何解决这个问题吗?非常感谢任何建议!

谢谢!

1 个答案:

答案 0 :(得分:3)

只需将np.arange(8) + 1更改为range(1,9)

补充说明:您遇到的问题是np.arange正在生成int32个数字,最大值超过20亿。计算8**np.int_(-11)时,计算结果为1. / (8**np.int_(11)),括号中的表达式大大超过20亿,因此会出现溢出。

第h