私はpythonで-1200の指数を計算しようとしています(例として、-1200は特に必要ありませんが、-1200前後の数字の集合です)。非常に小さな数値のPythonで指数関数
>>> math.exp(-1200)
0.0
これは私にアンダーフローを与えています。この問題を回避するにはどうすればよいですか?標準ライブラリで任意のヘルプ:)
私はpythonで-1200の指数を計算しようとしています(例として、-1200は特に必要ありませんが、-1200前後の数字の集合です)。非常に小さな数値のPythonで指数関数
>>> math.exp(-1200)
0.0
これは私にアンダーフローを与えています。この問題を回避するにはどうすればよいですか?標準ライブラリで任意のヘルプ:)
ため
おかげで、あなたはdecimal
モジュールで見ることができます:
>>> import decimal
>>> decimal.Decimal(-1200)
Decimal('-1200')
>>> decimal.Decimal(-1200).exp()
Decimal('7.024601888177132554529322758E-522')
あなたがdecimal
サポートよりも多くの機能が必要な場合は、ライブラリmpmath
で見ることができます、私はたくさんのように使用している:
>>> import mpmath
>>> mpmath.exp(-1200)
mpf('7.0246018881771323e-522')
>>> mpmath.mp.dps = 200
>>> mpmath.exp(-1200)
mpf('7.0246018881771325545293227583680003334372949620241053728126200964731446389957280922886658181655138626308272350874157946618434229308939128146439669946631241632494494046687627223476088395986988628688095132e-522')
が、可能であれば、あなたの方程式を書き直すことができれば、あなたが表示されるはずですログ空間全体で作業する
できるだけ長い対数領域で計算してみてください。私。正確な値を計算することは避けますが、指数で作業してください。
exp(-1200)は非常に小さい数値です(exp(1200)は非常に大きなものです)ので、正確な値は実際にあなたが興味を持っているものではありません。これらの数は、対数空間で十分でなければなりません。
あなたのご意見ありがとうございます。そのような2つの値を標準化するために絶対精度が必要です。例えばなぜ私はlog aとlog bを最初に持っていたのかというと、それは、ログの総数を使っていたので、e ^(log a)/(e ^(log a)+ e^log(b)非常に、非常に、大きかった製品に。 –
@Pi_:まあ、 'e ^(log a)/(e ^(log a)+ e^log(b))'単に 'a /(a + b)'ですか? – DSM
@astraujumsはい、私はaとbを持っていません。私はlog Aとlog bを持っています。これは-1200より小さいか小さいです。 –
ありがとう、私は必要なものを行います:) –
私はログとログで作業しているので、ログスペースにとどまるために書き直すことができませんでしたし、ログを必要とする/(a + b) )これは、ログaとログbのみを有するときに得られることは自明ではない。 –