为什么我的Python3代码返回OverflowError?

时间:2013-12-23 16:52:06

标签: python-3.x

我从20世纪70年代充满流程图和微积分示例的weird, old book中得到了这个例子。它编写得不是很好,但我很乐意将流程图写入Python并试图找出这些方程实际上是什么以及它们是如何工作的。

这个特殊的例子声称代表了Malthus和Verhulst人口增长模型的线性近似。 (警告说:我在本书中的方程与所谓的 Verhulst方程逻辑函数之间找不到任何关系。)

import math

def malthus_verhulst():
    a = int(input("please enter a value for a\n:%"))
    b = int(input("please enter a value for b\n:%"))
    c = int(input("please enter a value for c\n:%"))
    p = []
    v = []
    p1 = float(input("please enter a value for p1\n:%"))
    v1 = float(input("please enter a value for v1\n:%"))
    p.append(p1)
    v.append(v1)
    for k in range(50):
        p.append((1+c)*p[k])
        v.append(v[k]+(a*v[k] - math.pow(b*v[k],2)))
    print(p,v)

有没有办法将其重写为适用于a,b,c,p1和v1的各种值的位置?

$ python -i scratchpad.py 
>>> malthus_verhulst()
please enter a value for a
:%2
please enter a value for b
:%2
please enter a value for c
:%2
please enter a value for p1
:%2
please enter a value for v1
:%2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "scratchpad.py", line 92, in malthus_verhulst
    v.append(v[k]+(a*v[k] - math.pow(b*v[k],2)))
OverflowError: math range error
>>> 

1 个答案:

答案 0 :(得分:0)

如果在异常处理程序中打印v的值,您将看到它快速超出范围,最后一个值为-3.1331863238009388e + 206。由于数字的平方值使指数加倍,而float的最大指数约为308,因此算法会爆炸。确保您的输入值在算法的域内。