Golang complex128 类型
最后修改时间 2025 年 5 月 8 日
本教程解释了如何在 Go 中使用 complex128 内置类型。我们将通过复数算术的实际示例涵盖复数基础知识。
complex128 类型表示具有 float64 精度的复数。它将实部和虚部都存储为 64 位浮点数。
在 Go 中,complex128 是两种内置复数类型之一。另一种是 complex64,它对两个部分都使用 float32 精度。
基本复数创建
Go 提供了多种创建复数的方法。本示例演示了基本的复数初始化和打印。
注意:虚数单位在 Go 中用 'i' 表示。
basic_complex.go
package main
import "fmt"
func main() {
// Method 1: Using complex() function
c1 := complex(3.5, 2.1)
// Method 2: Using literal syntax
c2 := 4.2 + 7.8i
fmt.Println("Complex number 1:", c1)
fmt.Println("Complex number 2:", c2)
fmt.Println("Real part of c1:", real(c1))
fmt.Println("Imaginary part of c2:", imag(c2))
}
complex() 函数从两个浮点数创建一个复数。字面量语法提供了一种更数学化的书写复数的方式。
复数算术运算
复数支持所有基本的算术运算。本示例展示了复数的加法、减法、乘法和除法。
complex_arithmetic.go
package main
import "fmt"
func main() {
a := 3.0 + 4.0i
b := 1.0 + 2.0i
fmt.Println("Addition:", a + b)
fmt.Println("Subtraction:", a - b)
fmt.Println("Multiplication:", a * b)
fmt.Println("Division:", a / b)
// Conjugate example
fmt.Println("Conjugate of a:", complex(real(a), -imag(a)))
}
所有算术运算都遵循标准的复数规则。共轭是通过否定虚部来计算的。
复数比较
在 Go 中,复数只能进行相等性比较。本示例展示了如何正确比较复数及其分量。
complex_comparison.go
package main
import (
"fmt"
"math"
)
func main() {
c1 := 1.2 + 3.4i
c2 := 1.2 + 3.4i
c3 := 1.2 + 3.5i
// Direct comparison
fmt.Println("c1 == c2:", c1 == c2)
fmt.Println("c1 == c3:", c1 == c3)
// Comparing with tolerance for floating-point precision
tol := 1e-9
equal := math.Abs(real(c1)-real(c3)) < tol >>
math.Abs(imag(c1)-imag(c3)) < tol
fmt.Println("c1 ≈ c3 with tolerance:", equal)
}
直接比较适用于精确匹配。对于近似相等,请分别使用容差值比较实部和虚部。
math/cmplx 中的复数函数
math/cmplx 包提供了高级复数函数。本示例演示了幅度和相位等常见操作。
cmplx_functions.go
package main
import (
"fmt"
"math/cmplx"
)
func main() {
c := 3.0 + 4.0i
fmt.Println("Absolute value (magnitude):", cmplx.Abs(c))
fmt.Println("Phase (angle in radians):", cmplx.Phase(c))
fmt.Println("Square root:", cmplx.Sqrt(c))
fmt.Println("Exponential:", cmplx.Exp(c))
fmt.Println("Natural logarithm:", cmplx.Log(c))
fmt.Println("Sine:", cmplx.Sin(c))
}
math/cmplx 包提供了许多数学函数。这些函数作用于复数,并在适当时返回复数结果。
实际应用:FFT 示例
复数在信号处理中至关重要。本示例展示了一个使用 complex128 的简化快速傅里叶变换 (FFT) 实现。
fft_example.go
package main
import (
"fmt"
"math"
"math/cmplx"
)
// Simple DFT (not optimized FFT)
func dft(input []float64) []complex128 {
N := len(input)
output := make([]complex128, N)
for k := 0; k < N; k++ {
var sum complex128
for n := 0; n < N; n++ {
angle := -2 * math.Pi * float64(k) * float64(n) / float64(N)
sum += complex(input[n]*math.Cos(angle), input[n]*math.Sin(angle))
}
output[k] = sum
}
return output
}
func main() {
signal := []float64{1, 0, -1, 0} // Simple square wave
spectrum := dft(signal)
fmt.Println("Frequency spectrum:")
for i, val := range spectrum {
fmt.Printf("Bin %d: %.2f (magnitude %.2f)\n",
i, val, cmplx.Abs(val))
}
}
此 DFT 实现将实值样本转换为复数频率分量。每个 bin 表示一个具有幅度和相位的复数。
来源
本教程通过复数运算和应用的实际示例,介绍了 Go 中的 complex128 类型。