【问题标题】:Overflow Error: ..long int too large溢出错误:..long int 太大
【发布时间】:2014-09-11 08:19:23
【问题描述】:
import math
a = 100
b = 110
e = 2.71828
x = (e**-a)*(a**b)/math.factorial(b)
print round(x, 5)

当 a 和 b 很大时,我会收到以下消息:

Traceback (most recent call last):
  File "<stdin>", line 5, in <module>
OverflowError: long int too large to convert to float

【问题讨论】:

  • math.factorial(b) == 198! == 1.98..e370 大于 Double.MaxValue
  • 似乎不言自明:值太大
  • 一个更好的问题可能是问为什么需要 198 的阶乘!
  • 这是泊松分布,我需要 140 - 220 之间的数字

标签: python


【解决方案1】:

您似乎正在尝试实现泊松分布。对于较大的平均值,它可以很好地近似为高斯分布,您不需要计算阶乘(正如其他人已经说过的那样,它太大了)。

http://en.wikipedia.org/wiki/Poisson_distribution#Related_distributions

编辑:事件 k 的数量与均值无关,但通常不希望小 L 的概率为 P(200|L),或者将其四舍五入为零。

还看看 Scipy 的实现,它似乎使用对数,另一种方式或避免非常大的数字: https://github.com/scipy/scipy/blob/v0.14.0/scipy/stats/_discrete_distns.py

编辑:因为它是被请求的,所以在 R 中进行演示(因为在我当前的设置中它对我来说更快,但数学是相同的)。我取了 lambda = mean = sigma^2 = 500(没有 n

pois = rpois(1000, 500)
norm = rnorm(1000, 500, sqrt(500))
plot(density(pois))
lines(density(norm))

【讨论】:

  • 你是如何了解 OP 的意愿的?
  • 公式很容易识别。出于类似的原因,我不得不用泊松近似二项式。在某些时候,即使使用 Decimal,您也会达到硬件的极限。
  • 是的,这是泊松,我不知道他与高斯相似,谢谢
  • 它已经很旧了,但是你能添加代码来证明你的建议吗?
  • @0x90 数学不会太老,你会在数学书中找到演示。但我使用简单的 R 代码添加了一个图形示例。
【解决方案2】:

只要 (a**b) >> math.factorial(b) 你就可以做到

(a**b)/math.factorial(b)*(e**-a)

这样数字在转换为浮点数之前会变小

【讨论】:

    【解决方案3】:

    您超出了最大浮点值 (1.7976931348623157e+308)。

    使用decimal 模块:

    import math
    from decimal import Decimal   
    a = 200
    b = 198
    e = 2.71828
    x = Decimal(e**-a)*Decimal(a**b)/math.factorial(Decimal(b))
    print round(x, 5)   
    

    输出:

    0.02806
    

    将其与WloframAlpha 计算出的0.0280567 的输出进行比较


    如果您想查看浮动信息,请参阅this

    >>> import sys
    >>> print  sys.float_info
    sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
    

    【讨论】:

    • 有趣。这适用于 198,但随着数字的增加会迅速填满你的整个记忆,还是我错了?
    猜你喜欢
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    相关资源
    最近更新 更多