复数
如何选择复数的表示精度?
- 复数: 由实部和虚部组成的数,写成
a + bi,其中i表示虚数单位; - imaginary literal: 以
i结尾的虚数字面量,例如2i; complex64: 实部和虚部各使用float32;complex128: 实部和虚部各使用float64,也是复数常量推断时的常用目标类型;- 选择原则: 没有明确的内存或外部格式约束时,优先使用精度更高的
complex128;
如何创建复数并读取实部和虚部?
- 字面量:
1 + 2i直接表示实部为1、虚部为2的复数; complex:complex(real, imag)根据两个浮点数创建复数;real: 返回复数的实部;imag: 返回复数的虚部;
z1 := complex(1.0, 2.0)
var z2 complex128 = 3 + 4i
println(real(z1), imag(z1)) // 1 2
println(real(z2), imag(z2)) // 3 4
- 分量类型: complex64 的 real/imag 结果为 float32,complex128 对应 float64;构造时两个有类型的实参需要使用相同浮点类型;
var re, im float32 = 3, 4
z := complex(re, im) // complex64
var component float32 = real(z)
println(component, imag(z)) // 3 4
复数运算有哪些类型与精度限制?
- 支持运算: 复数可以使用
+、-、*、/和相等比较; - 类型一致: 不同命名类型或不同精度参与赋值时,可能需要显式转换;
- 精度边界: 两部分都遵循浮点数的误差规则;转换精度不会补回已经丢失的信息;
- 标准库:
math/cmplx提供绝对值、相位、指数和三角函数等复数运算;
sum := (1 + 2i) + (3 + 4i)
product := (1 + 2i) * (3 + 4i)
println(sum, product)
复数适合解决什么问题, 哪些场景不需要复数?
- 常见领域: 信号处理、电路、频域分析和需要二维旋转表示的数学计算;
- 普通业务: 计数、金额、时间等数据通常不需要复数;
- 建模原则: 只有问题本身包含实部与虚部时才使用复数,不因语法方便替代普通结构体;