复制Python的complexnumbertostring转换

2024-10-03 23:29:45 发布

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

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. 有时它会打印0-0,就像在eg1和eg4中一样

  3. eg2和eg5。

我知道这没什么区别,但我想实现与Python完全相同的功能。我的意思是输出应该完全相同。在

任何帮助都将不胜感激。 这不是家庭作业问题,也谢谢你的阅读。在


Tags: 字符串import规则operator解释器形式复数eg
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。例如:

^{pr2}$

加法使实部正规化为+0

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

与正虚数相乘保持实部负号,但乘以负虚数不会使实部负。在

但所有这些都只是实现细节,所以在Python的不同实现中可能会有所不同。在

浮点对于正零和负零有两种不同的表示形式,这是ieee754浮点实现的一个细节。见https://en.wikipedia.org/wiki/Signed_zero

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

^{4}$

第一部分适用于两种形式的零。第二部分只有当实部不是负的(copysign(x,y)给出了带有y符号的{}的值,因此{}将是{}。在

如果您想实现另一个程序来精确复制CPython解释器的当前行为,可以研究复数表示的源代码:^{}。此函数负责将复数转换为字符串。在

一些血腥的细节可以在函数^{}中找到。在

我不认为浮点数的确切交互输出是官方Python语言规范的一部分,因此源代码可能是这里最好的指南。在


编辑:如果你不想重新发明轮子,那可能是时候研究一下embedding Python in another application。在

相关问题 更多 >