2013-12-16 96 views
3

我有一些在其计算中使用大整数的代码。因为我也使用numpy,所以似乎有些变量被设置为'numpy.int64'类型,这意味着它们超过了流量。我怎样才能解决这个问题?numpy代码溢出错误

如果您运行下面的代码,您将看到“调试信息”下的行。例如,

19 1 72.7204246831 524288 
19 2 2437717.7229 274877906944 
19 3 149857055799.0 144115188075855872 
19 4 1.73379003246e+16 0 

其中前两列是n和w,最后一列是2 **(n * w)。显然0是一个溢出错误。

我该如何解决这个问题?

#!/usr/bin/python 
from __future__ import division 
from scipy.misc import comb 
from scipy.misc import factorial 
import math 
import numpy as np 

N = 20 
X = np.arange(2,N) 

def k_loop_n(w,n): 
    K = np.arange(0, w+1) 
    return (comb(w,K)*(comb(w,K)/2**w)**n).sum() 

def w_loop(n): 
    print "w loop" 
    v = [comb(n,w)*k_loop_n(w,n) for w in range(1,n+1)] 
    print v 
    return sum(v) 

#This is meant to be an upper bound for sum (w choose i)^(n+1), i = 0..w 
def sum_upper(i,n): 
    return (i+1)*((2**i)*math.sqrt(2/(i*np.pi))*(1-1/(4*i)))**(n+1) 

def w_loop_upv2(n): 
    print "w loop upper bound" 
    print "debugging info" 
    print type(n) 
    for w in range(1,n+1): 
     print n, w, sum_upper(w,n), 2**(w*n) 
    v = [comb(n,w)*sum_upper(w,n)/2**(w*n) for w in range(1,n+1)] 
    return sum(v) 

def upper_k_loop(w,n): 
    K = np.arange(0, w+1) 
    return (upperbin(w,K)*(upperbin(w,K)/2**w)**(3*float(n)/np.log(n))).sum() 


def upper_w_loop(n): 
    v = [upperbin(n,w)*k_loop(w,n) for w in range(1,n+1)] 
    return sum(v) 


print X 
Y = [w_loop(n) for n in X] 
Yupper = [w_loop_upv2(n) for n in X] 

print Y 
print Yupper 
+0

检查'np.long(2 ** 10000)' –

回答

3

如果您打算处理的数量非常大,您将希望能够控制精度。看看python库mpmath

Mpmath是一个用于多精度浮点运算的纯Python库。它提供了一套广泛的超越函数,无限指数大小,复数,区间算术,数值积分和微分,寻根,线性代数等等。几乎任何计算都可以以10位或1000位精度执行,并且在许多情况下,mpmath实现渐近式快速算法,这些算法可以很好地进行高精度工作。默认情况下,Mpmath在内部使用Python的内置长整数,但如果安装了gmpy或从Sage内部导入mpmath,则会自动切换到GMP/MPIR以实现更快的高精度算术运算。

编辑:因为它看起来像我可以在前面的回答已经提供了上面的代码:

https://stackoverflow.com/a/20576452/249341

我想重申的是,你应该与logrithmic表示合作在这里,除非你需要一些组合计算的确切数字。使用log(x)而不是x将解决在这种情况下的表示问题,而不需要去mpmath。

2

如果您要超过64位整数范围,请使用浮点数。否则,如果您需要整数精度但想要64位范围以外的值,则可以使用Python Decimal对象。有关在numpy中使用十进制的详细信息,请参阅this answer