2017-05-17 11 views
2

私はPythonの初心者です。簡単な質問を申し訳ありません。Pythonで64float精度の指数オーバーフローを処理する方法は?

次のコードでは、指数を計算してからログを取得します。

Y=numpy.log(1+numpy.exp(1000))

問題は、私は710の以上の数numpy.exp()関数が返す「INF」の指数を取るとき、私はそれが「INF」を印刷64floatでそれを印刷する場合でも、ということです。

この問題に関する助けがあれば幸いです。

+3

「n」が大きければ、numpy.log(1 + numpy.exp(1000))は 'n'になります。必要とする精度は何ですか? – ayhan

+0

チェックアウトフロート吸収。 '1 + numpy.exp(100)'はすでに 'numpy.exp(100)'と同じです –

答えて

2

このような操作を行うには、np.logaddexp()ファンクションを使用できます。明示的に中間のexp()値を計算することなくlogaddexp(x1, x2) == log(exp(x1) + exp(x2))を計算します。これによりオーバーフローが回避されます。 exp(0.0) == 1以降は、np.logaddexp(0.0, 1000.0)を計算し、1000.0の結果を期待どおりに取得します。

+0

素晴らしい、簡単な答えです。ありがとう、ロバート – Sahim

1

は小数点ライブラリを使用します。

>>> 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') 
1

チェック最低値は吸収され、加算には全く影響しません。両方の値は厳密に等しくなります。

>>> 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と遊ぶ

は、私はそれをテストしました。

関連する問題