我正在尝试在python中编写一个公式来确定具有成功概率p的伯努利试验。公式为:https://imgur.com/gallery/IyqcYSr
下面的代码适用于小数字,例如输入为outerSum(2,20,7,.25,.75)
它会评估为大约2.44 x 10 ^ -6(这是正确的,我用枫树检查过)。
但是我的问题是当我在大数字上运行它(我使用的是公式)时,代码不起作用并且给我一个错误:ValueError: -inf + inf in fsum
。
我的理想输入是outerSum(2,31290,1755,.25,.75)
但是我收到了上面的错误。如何在下面的特定公式中优化我的代码以将数字加到无穷大或非常大的数字?理想的输入方案是outerSum(2,31290,1755,.25,.75)
import math
from sympy import binomial
import numpy
def innerSum(k,n,x,y):
#z = ((n - k * x - y) / k)
f = []
g = 0
for j in range(0, int(math.floor(n - k * x - y / k))):
b = math.pow(-1, j)
c = binomial(y + 1, j)
d = binomial(n - k * x - j * k, y)
e = b * c * d
f.append(e)
g = math.fsum(f)
return g
def outerSum(k,n,x,p,q):
a = math.floor((n - k * x) / k) # math.floor(((n-k*x)/k))
a = int(a)
b = (n - k * x)
b = int(b)
h = []
for y in range(a, b + 1):
c = math.pow(q, y)
d = math.pow(p, n - y)
e = binomial(y + x, x)
f = innerSum(k, n, x, y)
g = c*d*e*f
h.append(g)
i = math.fsum(h)
#print(i)
print(i)
outerSum(2,20,7,.25,.75)