Python中复数的格式

2024-05-29 03:54:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道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

我是不是丢了什么东西?


Tags: 方法true示例类型方式real例子复数
3条回答

它打印0j以指示它仍然是一个complex值。你也可以这样打回去:

>>> 0j
0j

其余的可能是IEEE 754 floating point representation魔法的结果,它区分了0和-0,即所谓的signed zero。基本上,有一个位表示这个数字是正是负,而不管这个数字恰好是零。这解释了为什么1j * -1给出了一个负零实部:正零乘以-1。

标准要求-0与+0进行比较,这解释了为什么(1j * -1).real == 0.0仍然有效。

Python仍然决定打印-0的原因是,在复杂的世界中,这些操作会对分支切割产生影响,例如在the ^{} function

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

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

  • 0j是一个imaginary literal,它确实表示复数,而不是整数或浮点数。

  • +-0(“有符号零”)是Python在Python中自^{} is by definition a pair of floating point numbers以来遵守IEEE 754 floating point representation的结果。由于是后者,因此也不需要为complex打印或指定零分数部分。

  • -0部分是printed以便准确地表示内容as ^{}'s documentation demandsrepr()在操作结果输出到控制台时被隐式调用)。

  • 关于为什么(-0+1j) = 1j但是(1j*-1) = (-0+1j)的问题。 注意(-0+0j)(-0.0+0j)不是单个复数,而是添加到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)

答案在于Python源代码本身。

我来举你的一个例子。让

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

当您完成a*b时,您将调用this function

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,你得到了一个negative zero,从that's not +0,你得到了打印时的parens和真实部分。

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. */
...

我想(但我不确定)这个基本原理来自于用基本复杂函数计算时这个符号的重要性(在维基百科关于符号0的文章中有这样的参考)。

相关问题 更多 >

    热门问题