首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python中复数的格式

Python中复数的格式
EN

Stack Overflow用户
提问于 2012-11-15 05:38:29
回答 3查看 17.2K关注 0票数 20

我想知道Python (3.3.0)打印复数的方式。我正在寻找一种解释,而不是一种改变指纹的方法。

示例:

代码语言:javascript
复制
>>> complex(1,1)-complex(1,1)
0j

为什么不直接打印"0“呢?我的猜测是:保持类型complex的输出。

下一个示例:

代码语言:javascript
复制
>>> complex(0,1)*-1
(-0-1j)

那么,一个简单的"-1j“或"(-1j)”就可以了。为什么是"-0"??这不是和+0一样吗?这似乎不是一个舍入问题:

代码语言:javascript
复制
>>> (complex(0,1)*-1).real == 0.0
True

当虚部为正时,-0就消失了:

代码语言:javascript
复制
>>> complex(0,1)
1j
>>> complex(0,1)*-1
(-0-1j)
>>> complex(0,1)*-1*-1
1j

再举一个例子:

代码语言:javascript
复制
>>> 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

我是不是漏掉了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-15 05:56:39

它输出0j以表明它仍然是一个complex值。您也可以用这种方式重新键入:

代码语言:javascript
复制
>>> 0j
0j

剩下的可能是IEEE 754 floating point representation的魔力造成的,它区分了0和-0,即所谓的signed zero。基本上,有一个比特来表示数字是正数还是负数,无论数字是否恰好为零。这就解释了为什么1j * -1会给出一个带负零实部的东西:正零被乘以-1。

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

Python仍然决定打印-0的原因是,在复杂的世界中,它们对分支削减有影响,例如在the phase function

代码语言:javascript
复制
>>> phase(complex(-1.0, 0.0))
3.141592653589793
>>> phase(complex(-1.0, -0.0))
-3.141592653589793

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

票数 18
EN

Stack Overflow用户

发布于 2012-11-15 06:11:25

答案在于Python源代码本身。

我将使用您的一个示例。让

代码语言:javascript
复制
a = complex(0,1)
b = complex(-1, 0)

当你执行a*b时,你调用的是this function

代码语言:javascript
复制
real_part = a.real*b.real - a.imag*b.imag
imag_part = a.real*b.imag + a.imag*b.real

如果你在python解释器中这样做,你会得到

代码语言:javascript
复制
>>> real_part
-0.0
>>> imag_part
-1.0

从IEEE754中,您会得到一个negative zero,而从that's not +0开始,在打印它时,您会得到括号和实部。

代码语言:javascript
复制
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. */
...

我猜想(但我不确定),理由来自于在计算初等复函数时该符号的重要性(在wikipedia上关于有符号零的文章中有关于这一点的参考)。

票数 4
EN

Stack Overflow用户

发布于 2012-11-15 05:59:45

就第一个问题而言:如果它只打印0,那么它在数学上是正确的,但您不会知道您正在处理的是complex对象还是int。只要你不指定.real,你总是会得到一个J分量。

我不确定为什么您会得到-0;它在技术上并不是错误的(-1 * 0 = 0),但在语法上却很奇怪。

至于其余的,奇怪的是它不一致,然而没有一个在技术上是正确的,只是实现的一个工件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13387782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档