代码之家  ›  专栏  ›  技术社区  ›  user4288514

大数与长整数之间的除法:如何绕过浮点转换?

  •  1
  • user4288514  · 技术社区  · 7 年前

    我需要计算非常大的数字之间的比率,如代码所示:

    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
    

    我怎么处理这么大的数字?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Paul Panzer    7 年前

    您可以使用 scipy.special.comb exact kwd并将*大^(-1)替换为/大:

    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.4714229501232675e-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]
    

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

    注:以上适用于Python3。在Python2上,int之间的除法默认返回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