操作太久,浮在Python
嘛错误来了约,因为你试图乘
3600**3400
这是一个长与
exp(-3600)
这是一个浮点数。
但无论如何,您收到的错误是掩盖真正的问题。无论如何,看起来exp(-3600)的数字太大了。充其量,蟒蛇数学图书馆是变幻莫测的。
其实exp(-3600)是一个非常小(接近于零)的数字 – 2009-10-06 15:43:29
我相信你的意思是3600 ** 3400是一个数字太大以至于无论如何都适合浮动。顺便说一句,math.exp(-3600)== 0.0 – foosion 2009-10-06 15:58:01
尝试使用对数而不是直接使用数字。由于您的操作都不是加法或减法,因此您可以以对数形式完成所有操作并在最后转换回来。
您可以尝试使用Decimal对象。计算速度会比较慢,但对于非常小的数字你不会有问题。
from decimal import Decimal
但是,我不知道Decimal与scipy模块的交互方式。
这可能与numpy discussion有关。
用这样大小的数字进行计算,你不能使用普通的64位或更多的浮点数,这是Python的核心运行时支持的。考虑gmpy
(做不获得SourceForge上的版本,它是亿万过时) - 与,math
,还有一些护理...:
>>> e = gmpy.mpf(math.exp(1))
>>> gmpy.mpz(3600)**3400 * (e**(-3600))/gmpy.fac(3400)
mpf('2.37929475533825366213e-5')
(我有偏见约gmpy
,当然,因为我起源和仍然参与该项目,但我从来没有对其浮点数能力强大的声明...我一直主要用于整数的东西......仍然,它确实做这个计算可能!-)。
EXP(-3600)太斯梅尔,阶乘(3400)过大:
In [1]: from scipy import exp
In [2]: exp(-3600)
Out[2]: 0.0
In [3]: from scipy import factorial
In [4]: factorial(3400)
Out[4]: array(1.#INF)
怎么样计算它一步一步的解决方法(和它有道理 检查最小和最大中间结果):
from math import exp
output = 1
smallest = 1e100
biggest = 0
for i,j in izip(xrange(1, 1701), xrange(3400, 1699, -1)):
output = output * 3600 * exp(-3600/3400)/i
output = output * 3600 * exp(-3600/3400)/j
smallest = min(smallest, output)
biggest = max(biggest, output)
print "output: ", output
print "smallest: ", smallest
print "biggest: ", biggest
输出为:
output: 2.37929475534e-005
smallest: 2.37929475534e-005
biggest: 1.28724174494e+214
和你的问题是什么? – SilentGhost 2009-10-06 14:58:48
发生错误。而不是输出。 – wildfire 2009-10-06 15:01:28
我们知道*错误发生*,如果一切正常,您不会在这里写信,是吗? – SilentGhost 2009-10-06 15:01:31