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交互式解释器中出现的字符串表示的确切规则?像一些人一样,
在eg1中它打印0j
但在eg3中则不打印。
有时它会像eg1和eg4中那样打印0
,-0
eg2和eg5。
我知道它并没有什么不同,但我希望实现与Python完全相同的功能。我的意思是输出应该完全相同。
非常感谢任何帮助。 这不是一个家庭作业问题,也要感谢阅读。
答案 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
}。