复制Python的复数到字符串转换

时间:2018-02-26 09:58:50

标签: python python-3.x compatibility complex-numbers string-conversion

import operator
>>> operator.truediv(-5.6, complex(-1, 0)) #eg1
(5.6-0j)
>>> operator.truediv(-5.6, complex(0, -1)) #eg2
(-0-5.6j)
>>> operator.truediv(-5.6, complex(0, 1)) #eg3
5.6j
>>> operator.truediv(-5.6, complex(1, 0)) #eg4
(-5.6+0j)
>>> operator.truediv(5.6, complex(0,-1)) #eg 5
(-0+5.6j)

有没有办法知道将复数转换为Python交互式解释器中出现的字符串表示的确切规则?像一些人一样,

  1. 在eg1中它打印0j但在eg3中则不打印。

  2. 有时它会像eg1和eg4中那样打印0-0

  3. eg2和eg5。

  4. 我知道它并没有什么不同,但我希望实现与Python完全相同的功能。我的意思是输出应该完全相同。

    非常感谢任何帮助。 这不是一个家庭作业问题,也要感谢阅读。

1 个答案:

答案 0 :(得分:2)

Python将始终显示复数的虚部,因为否则您无法区分它确实复杂的输出。这类似于将.0包含在浮点数上,即使它只是一个整数。

如果不是+0,则显示实部。在示例中,您将显示实部,因为它为负零。注意,在浮点负和正零具有不同的表示,即使它们比较相等:

>>> float.fromhex('-0x0.0')
-0.0
>>> float.fromhex('0x0.0')
0.0
>>> float.fromhex('-0x0.0') == 0.0
True

这可能对模拟Python的输出没有多大帮助,因为你可能无法预测Python何时会在结果中得到负0。例如:

>>> neg0 = float.fromhex('-0x0.0')
>>> neg0
-0.0
>>> neg0+0j
0j

添加已将实部归一化为+0

>>> neg0*1j
(-0+0j)
>>> 0.0*(-1j)
-0j

乘以正虚数可以在实部保持负号,但乘以负虚数并不会使实部成为负数。

但所有这些只是实现细节,因此可能因Python的不同实现而有所不同。

浮点有两个单独的正负零表示的事实是IEEE 754浮点实现的细节。见https://en.wikipedia.org/wiki/Signed_zero

检测是否输出实部的源代码部分包括:

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

对于两种形式的零,第一部分都是正确的。仅当实部不是负数时,第二部分才是真的(copysign(x,y)给出x的值为y的符号,因此copysign(1.0, negativezero)将为-1 }。