私はこれを計算しようとしています:
from scipy import *
3600**3400 * (exp(-3600)) / factorial(3400)
エラー:サポートされていないlongおよびfloat
私はこれを計算しようとしています:
from scipy import *
3600**3400 * (exp(-3600)) / factorial(3400)
エラー:サポートされていないlongおよびfloat
数値を直接操作する代わりに、対数を使用してみてください。演算は加算または減算ではないため、すべてを対数形式で実行し、最後に元に戻すことができます。
このような規模の数値で計算すると、Pythonのコアランタイムがサポートする通常の64ビット程度の浮動小数点数を使用することはできません。考えてみてください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) は小さすぎ、factorial(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
乗算しようとしているため、エラーが発生しています
3600**3400
これは長いです
exp(-3600)
これはフロートです。
しかし、とにかく、あなたが受け取っているエラーは本当の問題を偽装しています. とにかく、exp(-3600) は大きすぎて float に収まらないようです。python 数学ライブラリは、せいぜい大きな数では気まぐれです。