Python中复数的格式

cxx*_*xxl 19 python complex-numbers

我想知道Python(3.3.0)打印复数的方式.我正在寻找解释,而不是改变印刷品的方法.

例:

>>> complex(1,1)-complex(1,1)
0j
Run Code Online (Sandbox Code Playgroud)

为什么不打印"0"?我的猜测是:保持类型复杂的输出.

下一个例子:

>>> complex(0,1)*-1
(-0-1j)
Run Code Online (Sandbox Code Playgroud)

好吧,一个简单的"-1j"或"( - 1j)"就可以了.为什么"-0"?? 和+0不一样吗?它似乎不是一个舍入问题:

>>> (complex(0,1)*-1).real == 0.0
True
Run Code Online (Sandbox Code Playgroud)

当假想部分变为正数时,-0消失:

>>> complex(0,1)
1j
>>> complex(0,1)*-1
(-0-1j)
>>> complex(0,1)*-1*-1
1j
Run Code Online (Sandbox Code Playgroud)

又一个例子:

>>> 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
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么吗?

Tho*_*mas 16

它打印0j以表明它仍然是一个complex值.您也可以这样输入:

>>> 0j
0j
Run Code Online (Sandbox Code Playgroud)

剩下的可能是IEEE 754浮点表示法的神奇结果,它区分0和-0,即所谓的有符号零点.基本上,只有一个位表示数字是正数还是负数,无论数字是否恰好为零.这解释了为什么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
Run Code Online (Sandbox Code Playgroud)

这是关于想象的部分,而不是真实的部分,但很容易想象实际部分的符号会产生类似差异的情况.

  • 我只想添加这个答案,所有描述的情况都是有效的,python按预期工作.您可以找到与IEEE 754相关的所有表示的特殊测试用例:`Lib/tests/test_complex.py`,`test_negative_zero_repr_str` (2认同)