go原生支持complex64和complex128类型,四则运算及real/imag由语言内置提供;math/cmplx仅含exp、sqrt、log等复数超越函数,无四则运算接口,且默认返回主值分支。

Go 原生支持复数类型,math/cmplx 是配套的标准库,专用于复数函数计算;它不处理基本四则运算(+、-、*、/ 已由语言内置支持),只提供 Exp、Sqrt、Log、Sin 等超越函数。
复数字面量与基本运算无需 cmplx
Go 有内置复数类型 complex64 和 complex128,直接用字面量声明即可:
z := 3 + 4i // 类型自动推导为 complex128 w := 1.5 + 2.5i // 同上 sum := z + w // ✅ 编译通过,语言级支持 prod := z * w // ✅ 不需要 cmplx 包 realPart := real(z) // ✅ 提取实部,用 built-in 函数 imagPart := imag(z) // ✅ 提取虚部
常见误区是以为加减乘除也要调 cmplx.Add 之类——实际不存在这些函数,math/cmplx 里根本没有四则运算接口。
cmplx 提供的函数全是“复数版数学函数”
它把 math 包中实数函数扩展到复平面,输入输出均为 complex128(部分函数也支持 complex64 变体,如 cmplx.Sqrt 接受 complex64 并返回 complex64):
立即学习“go语言免费学习笔记(深入)”;
-
cmplx.Exp(z):计算 ez,z 为复数(实部控制模长,虚部控制辐角) -
cmplx.Log(z):主值复对数,结果虚部 ∈ (-π, π];z == 0时返回NaN+NaNi -
cmplx.Sqrt(z):主平方根,分支切割沿负实轴;cmplx.Sqrt(-1)返回0+1i -
cmplx.Sin(z)、cmplx.Cos(z):按欧拉公式定义,非周期性受限于实部增长
注意:cmplx.Pow(z, w) 是 zw = exp(w × Log(z)),需小心 Log 的多值性和分支点(如 z=0 或负实数)。
精度、分支切割与 NaN 处理要手动检查
复数函数在奇异点行为不总符合直觉,且 Go 不做运行时异常,全靠返回 NaN 或 Inf 表示错误:
-
cmplx.Log(0)→(NaN+NaNi),不是 panic -
cmplx.Atan(complex128(math.Inf(1), 0))→NaN+NaNi(实部无穷大时可能失效) - 所有
cmplx函数默认使用主值分支,例如cmplx.Sqrt对负实数返回上半平面根(虚部 ≥ 0) - 若需自定义分支(如让
Sqrt返回下半平面根),得手动调整辐角:cmplx.Rect(math.Sqrt(cmplx.Abs(z)), (cmplx.Phase(z)+2*math.Pi)/2)
没有自动 error 返回,必须用 math.IsNaN(real(v)) || math.IsNaN(imag(v)) 显式检测。
与 C 的 兼容性几乎为零
Go 的 cmplx 设计目标不是兼容 C,而是提供安全、明确的主值函数。例如:
- C 中
csqrt(-1)行为依赖实现,Go 中cmplx.Sqrt(-1)恒为0+1i - C 的
clog可能返回不同分支,Go 的cmplx.Log始终返回主值 - Go 不提供
conj(共轭)函数,直接写real(z) - imag(z)*1i或封装为func Conj(z complex128) complex128 { return real(z) - imag(z)*1i }
跨语言对接时,别假设函数行为一致;尤其涉及相位连续性、多值处理或边界 case 时,务必查 Go 文档并实测。










