You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Python中(-1)**0.5计算结果存在误差?如何产生该结果?

Python计算(-1) ** 0.5出现微小实部误差的原因

先看你提到的现象:

>>> (-1) ** 0.5
(6.123233995736766e-17+1j)

这个结果里的微小实部不是Python的bug,而是因为运算符采用了通用的复数幂运算公式,而非直接套用sqrt(-1)=1j的定义。

具体计算过程拆解

Python中a ** b的底层实现遵循通用数学转换:
a ** b = exp(b * ln(a))

针对(-1) ** 0.5,步骤如下:

  1. 计算ln(-1):数学上它的主值是πj,但Python里使用的是浮点数近似的π(math.pi是π的二进制浮点数近似值,并非精确值),所以ln(-1)实际计算为math.pi * 1j。
  2. 乘以0.5:得到0.5 * math.pi * 1j,这个值是π/2的近似值乘以虚数单位。
  3. 计算指数exp():根据欧拉公式exp(xj) = cos(x) + sin(x)j,这里的x是π/2的近似值。理论上cos(π/2)=0,但因为x并非精确的π/2,cos(x)计算后得到一个极小的非零值(就是你看到的6.123233995736766e-17),而sin(x)近似为1,最终结果就出现了这个微小的实部误差。

如何得到精确的1j

如果需要精确的虚数单位结果,直接使用cmath.sqrt(-1)即可,它是专门针对复数平方根优化的实现,会直接返回1j:

>>> import cmath
>>> cmath.sqrt(-1)
1j

内容的提问来源于stack exchange,提问作者Kelly Bundy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 20:27:18