0

私はこれを計算しようとしています:

from scipy import *
3600**3400 * (exp(-3600)) / factorial(3400)

エラー:サポートされていないlongおよびfloat

4

5 に答える 5

3

数値を直接操作する代わりに、対数を使用してみてください。演算は加算または減算ではないため、すべてを対数形式で実行し、最後に元に戻すことができます。

于 2009-10-06T15:44:22.293 に答える
2

このような規模の数値で計算すると、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(もちろん、私はそのプロジェクトを始めてまだ参加しているので、偏見がありますが、その浮動小数点能力について強い主張をすることは決してありません...私は主に整数のものにそれを使用しています...それでも、それこの計算を可能にします!-)。

于 2009-10-06T17:58:45.833 に答える
1

Decimalオブジェクトを使用してみることができます。計算は遅くなりますが、実際に小さい数で問題が発生することはありません。

from decimal import Decimal

ただし、Decimalがscipyモジュールとどのように相互作用するかはわかりません。

この厄介な議論は関連があるかもしれません。

于 2009-10-06T15:53:16.083 に答える
0

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
于 2009-10-06T23:40:17.497 に答える
0

乗算しようとしているため、エラーが発生しています

3600**3400

これは長いです

exp(-3600)

これはフロートです。

しかし、とにかく、あなたが受け取っているエラーは本当の問題を偽装しています. とにかく、exp(-3600) は大きすぎて float に収まらないようです。python 数学ライブラリは、せいぜい大きな数では気まぐれです。

于 2009-10-06T15:31:18.087 に答える