跳到主要内容

复数

如何选择复数的表示精度?​

  • 复数: 由实部和虚部组成的数,写成 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)

复数适合解决什么问题, 哪些场景不需要复数?​

  • 常见领域: 信号处理、电路、频域分析和需要二维旋转表示的数学计算;
  • 普通业务: 计数、金额、时间等数据通常不需要复数;
  • 建模原则: 只有问题本身包含实部与虚部时才使用复数,不因语法方便替代普通结构体;