20

Python(3.3.0)が複素数を出力する方法について疑問に思っています。印刷を変更する方法ではなく、説明を探しています。

例:

>>> complex(1,1)-complex(1,1)
0j

なぜ「0」を出力しないのですか?私の推測では、複素数型の出力を保持することです。

次の例:

>>> complex(0,1)*-1
(-0-1j)

さて、単純な「-1j」または「(-1j)」でした。そして、なぜ「-0」?? +0と同じではないですか?丸めの問題ではないようです。

>>> (complex(0,1)*-1).real == 0.0
True

そして、虚数部が正になると、-0は消えます。

>>> complex(0,1)
1j
>>> complex(0,1)*-1
(-0-1j)
>>> complex(0,1)*-1*-1
1j

さらに別の例:

>>> complex(0,1)*complex(0,1)*-1
(1-0j)
>>> complex(0,1)*complex(0,1)*-1*-1
(-1+0j)
>>> (complex(0,1)*complex(0,1)*-1).imag
-0.0

ここで何かが足りませんか?

4

4 に答える 4

18

0jそれがまだ値であることを示すために出力されcomplexます。次のように入力することもできます。

>>> 0j
0j

残りはおそらくIEEE 754 浮動小数点表現の魔法の結果であり、0 と -0 を区別する、いわゆる符号付きゼロです。基本的に、数値がたまたまゼロであるかどうかに関係なく、数値が正か負かを示す 1 つのビットがあります。1j * -1これは、実数部が負のゼロである何かを与える理由を説明しています。正のゼロに -1 を掛けたものです。

標準では、+0 と等しいと比較するには -0 が必要であり、これ(1j * -1).real == 0.0が保持される理由を説明しています。

Python が依然として -0 を出力することを決定する理由は、複雑な世界では、これらがたとえば関数内phase分岐カットに違いをもたらすためです。

>>> phase(complex(-1.0, 0.0))
3.141592653589793
>>> phase(complex(-1.0, -0.0))
-3.141592653589793

これは実部ではなく虚部に関するものですが、実部の符号が同様の違いを生む状況は容易に想像できます。

于 2012-11-14T21:56:38.910 に答える
4

答えは、Python のソース コード自体にあります。

私はあなたの例の1つを扱います。させて

a = complex(0,1)
b = complex(-1, 0)

あなたがそうするとき、あなたはこの関数a*bを呼び出しています:

real_part = a.real*b.real - a.imag*b.imag
imag_part = a.real*b.imag + a.imag*b.real

そして、Pythonインタープリターでそれを行うと、次のようになります

>>> real_part
-0.0
>>> imag_part
-1.0

IEEE754 から、負のゼロを取得していますが、それは +0ではないため、印刷時に括弧と実数部分を取得します。

if (v->cval.real == 0. && copysign(1.0, v->cval.real)==1.0) {
    /* Real part is +0: just output the imaginary part and do not
       include parens. */
...
else {
    /* Format imaginary part with sign, real part without. Include
       parens in the result. */
...

初等複素数関数で計算するときのその符号の重要性から論理的根拠が得られると思います (符号付きゼロに関するウィキペディアの記事にこれに関する参照があります)。

于 2012-11-14T22:11:24.847 に答える
2
  • 0jは、整数や浮動小数点数ではなく実際に複素数を示す虚数リテラルです。

  • ( 「符号付きゼロ」) は、 PythonではIEEE 754 浮動小数点表現+-0への準拠の結果であり、定義により浮動小数点のペアであるためです。後者のおかげで、 a の端数ゼロの部分を出力したり指定したりする必要はありません。complexcomplex

  • この-0部分は、のドキュメントの要求どおりに内容repr()正確に表すために出力されます(repr()操作の結果がコンソールに出力されるたびに暗黙的に呼び出されます)。

  • なぜだか(-0+1j) = 1j(1j*-1) = (-0+1j)という質問についてです(-0+0j)or(-0.0+0j)は単一の複素数ではなくであるintこと に注意してfloatくださいcomplex。結果を計算するには、最初の数値がcomplex( -0->(0.0,0.0)整数には符号付きゼロがないため、-0.0-> (-0.0,0.0)) に変換されます。次に、.real.imagが対応する に追加さ1jれます(+0.0,1.0)。結果は(+0.0,1.0):^) です。複合体を直接構築するには、 を使用しますcomplex(-0.0,1)

于 2012-11-15T00:54:07.937 に答える
1

最初の質問に関する限り、印刷しただけ0であれば数学的には正しいでしょうが、complexオブジェクトとint. 指定しない限り、.real常に J コンポーネントを取得します。

なぜあなたが ; を取得するのかわかりません-0。技術的には間違って(-1 * 0 = 0)いませんが、構文的に奇妙です。

残りに関しては、一貫性がないのは奇妙ですが、技術的に正しいものはなく、実装の単なる成果物です。

于 2012-11-14T21:59:44.530 に答える