2

私のコード:

import math
import cmath
print "E^ln(-1)", cmath.exp(cmath.log(-1))

印刷されるもの:

E^ln(-1) (-1+1.2246467991473532E-16j)

印刷する内容:

-1

(参考までに、Googleは私の計算をチェックしています

python.org のドキュメントに よると、 cmath.exp(x)e^(x) がcmath.log(x)返され、ln (x) が返されるため、セミコロンなどがない限り、これは非常に単純な 3 行のプログラムです。

テストcmath.log(-1)すると、π i (技術的には3.141592653589793j) が返されます。どちらが正しいです。オイラーの恒等式は e^(π i ) = -1 と言いますが、Python は、e^(π i ) を上げると、ある種のクレイジーな話 (具体的には-1+1.2246467991473532E-16j) を得ると言っています。

Python が私を嫌うのはなぜですか? どうすればそれをなだめることができますか?

数学を正しく行うために含めるライブラリはありますか、それともヴァン・ロッサムに提供しなければならない犠牲はありますか? これはおそらくある種の浮動小数点精度の問題ですか?

私が抱えている大きな問題は、精度が十分にずれているため、他の値が最終関数の実際のゼロよりも0に近く表示されるため(表示されていません)、ブール値テストは価値がなく(つまりif(x==0))、局所最小値なども同様です. ..

たとえば、以下の反復では:

X = 2 Y= (-2-1.4708141202500006E-15j)
X = 3 Y= -2.449293598294706E-15j
X = 4 Y= -2.204364238465236E-15j
X = 5 Y= -2.204364238465236E-15j
X = 6 Y= (-2-6.123233995736765E-16j)
X = 7 Y= -2.449293598294706E-15j

3 と 7 はどちらも実際には 0 に等しいが、束の中で最大の虚数部を持っているように見え、4 と 5 には実数部がまったくない。

口調ごめんなさい。非常にイライラします。

4

3 に答える 3

3

既に示したように、正確cmath.log(-1)には を返しません。もちろん、無理数なので正確に返すことは不可能です... i*pipipi

eここで、正確ではない何かのべき乗にレイズし、正確i*piに になることを期待しています-1。ただし、それcmathが返された場合、誤った結果が得られます。(結局のところ、exp(i*pi+epsilon)等しいべきではありません-1-- オイラーはその主張をしません!)。

それだけの価値はありますが、結果は予想に非常に近く、実部は-1浮動小数点精度に近い虚部を持ちます。

于 2013-06-12T18:05:56.680 に答える