私はPythonの初心者です。簡単な質問を申し訳ありません。Pythonで64float精度の指数オーバーフローを処理する方法は?
次のコードでは、指数を計算してからログを取得します。
Y=numpy.log(1+numpy.exp(1000))
問題は、私は710の以上の数numpy.exp()関数が返す「INF」の指数を取るとき、私はそれが「INF」を印刷64floatでそれを印刷する場合でも、ということです。
この問題に関する助けがあれば幸いです。
私はPythonの初心者です。簡単な質問を申し訳ありません。Pythonで64float精度の指数オーバーフローを処理する方法は?
次のコードでは、指数を計算してからログを取得します。
Y=numpy.log(1+numpy.exp(1000))
問題は、私は710の以上の数numpy.exp()関数が返す「INF」の指数を取るとき、私はそれが「INF」を印刷64floatでそれを印刷する場合でも、ということです。
この問題に関する助けがあれば幸いです。
このような操作を行うには、np.logaddexp()
ファンクションを使用できます。明示的に中間のexp()
値を計算することなくlogaddexp(x1, x2) == log(exp(x1) + exp(x2))
を計算します。これによりオーバーフローが回避されます。 exp(0.0) == 1
以降は、np.logaddexp(0.0, 1000.0)
を計算し、1000.0
の結果を期待どおりに取得します。
素晴らしい、簡単な答えです。ありがとう、ロバート – Sahim
は小数点ライブラリを使用します。
>>> x = numpy.exp(100)
>>> y = x+1
>>> y==x
True
そうであっても(大丈夫計算)100
と、1(あるいは非常に大きな数)を追加して、このうち
>>> import numpy as np
>>> np.exp(1000)
inf
>>> from decimal import Decimal
>>> x = Decimal(1000)
>>> np.exp(x)
Decimal('1.970071114017046993888879352E+434')
チェック最低値は吸収され、加算には全く影響しません。両方の値は厳密に等しくなります。
>>> numpy.log(1e20+numpy.exp(100))==numpy.log(numpy.exp(100))
True
>>> numpy.log(1e30+numpy.exp(100))==numpy.log(numpy.exp(100))
False
はそう1e20
のようにも価値があなたが正確に1000.0
あなたの結果として、それが働いた場合でもなるだろうexp(100)
...
に吸収される:sys.float_info.epsilon
と遊ぶ
は、私はそれをテストしました。
「n」が大きければ、numpy.log(1 + numpy.exp(1000))は 'n'になります。必要とする精度は何ですか? – ayhan
チェックアウトフロート吸収。 '1 + numpy.exp(100)'はすでに 'numpy.exp(100)'と同じです –