2024-04-20 09:17:48 发布
网友
我在python中遇到了一些复杂数字平方根的混淆行为。运行此代码:
from cmath import sqrt a = 0.2 b = 0.2 + 0j print(sqrt(a / (a - 1))) print(sqrt(b / (b - 1)))
给出输出
0.5j -0.5j
类似的事情发生在
print(sqrt(-1 * b)) print(sqrt(-b))
看来这对语句应该给出相同的答案?
两个答案(+0.5j和-0.5j)都是正确的,因为它们是complex conjugates——即实部是相同的,虚部是符号翻转的。
+0.5j
-0.5j
查看code可以使行为清晰-结果的虚部始终具有与输入的虚部相同的符号,如第790行和第793行所示:
r.imag = copysign(d, z.imag);
因为a/(a-1)是0.25,它隐式地0.25+0j得到一个阳性结果;b/(b-1)产生0.25-0j(出于某种原因;不确定为什么它不会导致0.25+0jtbh),所以您的结果也是阴性的。
a/(a-1)
0.25
0.25+0j
b/(b-1)
0.25-0j
编辑:This question对同一问题有一些有用的讨论。
我能回答为什么会发生这种事,但不能回答为什么选择这种行为。
a/(a - 1)
计算结果为0.2/-0.8,即-0.25,由cmath.sqrt转换为复数,而
cmath.sqrt
b/(b - 1)
计算结果为(0.2+0j)/(-0.8+0j),即(-0.25-0j),转换为具有负复数成分的复数。
举个简单的例子
cmath.sqrt(0j) == 0j cmath.sqrt(-0j) == -0j
两个答案(
+0.5j
和-0.5j
)都是正确的,因为它们是complex conjugates——即实部是相同的,虚部是符号翻转的。查看code可以使行为清晰-结果的虚部始终具有与输入的虚部相同的符号,如第790行和第793行所示:
因为
a/(a-1)
是0.25
,它隐式地0.25+0j
得到一个阳性结果;b/(b-1)
产生0.25-0j
(出于某种原因;不确定为什么它不会导致0.25+0j
tbh),所以您的结果也是阴性的。编辑:This question对同一问题有一些有用的讨论。
我能回答为什么会发生这种事,但不能回答为什么选择这种行为。
计算结果为0.2/-0.8,即-0.25,由
cmath.sqrt
转换为复数,而计算结果为(0.2+0j)/(-0.8+0j),即(-0.25-0j),转换为具有负复数成分的复数。
举个简单的例子
相关问题 更多 >
编程相关推荐