2017-12-04 6 views
1
코드에서와 같이 나는 매우 많은 수의 비율을 계산해야

:긴 정수가있는 큰 숫자 사이의 구분 : float 변환을 우회하는 방법?

import scipy.special 

x=2000 
n=range(8,x+1) 
q=[] 

for i in range(0,len(n)): 

    q.append(((n[i]-6)*26**(n[i]-7)-scipy.special.binom(n[i]//7+n[i]%7,n[i]//7))*(26**n[i])**(-1)) 

내가 얻을 오류 번호가 너무 크므 :

OverflowError: long int too large to convert to float 

가 어떻게 그런 큰 숫자를 처리 할 수 ​​있습니까?

+0

어쩌면 당신이 여기처럼 사용자 정의 구현에 찬성 이항 계수를 scipy''드롭 할 수있는 미래의 수입 사용할 수 있습니다 : https://stackoverflow.com/questions를/26560726/python-binomial-coefficient. 정수를 사용하는 것 같습니다. –

+0

고마워,하지만 이항 계수에 문제가있는 것 같지도 않지만 26 – user4288514

+0

의 힘으로 보이기 때문에 'scipy'를 사용하지 않고 [mcve]를 만들 수 있습니다. 그렇게하면 더 많은 답변을 얻을 수 있습니다. –

답변

2

당신은 exact KWD로 scipy.special.comb를 사용하여 교체 할 수 있습니다 * 대형^(- 1) 대형 /과 :

(3**100)/(4**88) 
# 5.380792381981753e-06 

:

import scipy.special 

x=2000 
n=range(8,x+1) 
q=[] 

for i in range(0,len(n)): 

    q.append(((n[i]-6)*26**(n[i]-7)-scipy.special.comb(n[i]//7+n[i]%7,n[i]//7, exact=True))/(26**n[i])) 

print(q[-10:]) 

# [2.47142295e-07, 2.4726679994684175e-07, 2.473913048813568e-07, 2.4751580981587185e-07, 2.4764031475038685e-07, 2.477648196849019e-07, 2.478893246194169e-07, 2.4801382955393194e-07, 2.4813833448844694e-07, 2.48262839422962e-07] 

부문 자체가 문제가 될 것 같지 않습니다 참고 : 위 코드는 Python3에 적용됩니다. int 사이의 Python2 나눗셈에서는 int를 반환합니다. 당신은 __truediv__

q.append(((n[i]-6)*26**(n[i]-7)-scipy.special.comb(n[i]//7+n[i]%7,n[i]//7, exact=True)).__truediv__((26**n[i]))) 

를 사용하거나

from __future__ import division 
+0

속도가 중요한 경우'scipy.special.comb '대신'math.factorial'을 기반으로 한 간단한 조합 구현을 사용하여 조사 할 가치가 있습니다. . –

+0

파이썬 3을 사용하면 파이썬 3을 사용하는 경우 똑같은 코드가 작동합니다. 숫자를 실수로 나누어 나눗셈을 할 필요가 없기 때문입니다 (맞습니까?). 파이썬 2.7을 사용하는 방법이 있습니까? – user4288514

+0

@ user4288514 네, 파이썬 2에서는'int1 .__ truediv __ (int2)'를 사용할 수 있습니다. –

관련 문제