ZetCode

Golang complex64 类型

最后修改时间 2025 年 5 月 8 日

本教程将解释如何在 Go 中使用 complex64 内置类型。我们将通过实际的复数运算示例涵盖复数基础知识。

complex64 类型表示实部和虚部为 float32 的复数。它是 Go 中用于复数运算的内置数值类型之一。

在 Go 中,complex64 为复数提供了高效的存储。complex64 值的运算对两个分量都使用 32 位浮点精度。

基本 complex64 创建

创建 complex64 值最简单的方法是使用 complex 函数。此示例演示了基本的复数创建。
注意:虚部用 'i' 后缀表示。

basic_complex.go
package main

import "fmt"

func main() {

    // Create complex numbers
    a := complex(3.0, 4.0) // 3 + 4i
    b := complex(1.5, -2.5) // 1.5 - 2.5i
    
    fmt.Printf("a = %v (type %T)\n", a, a)
    fmt.Printf("b = %v (type %T)\n", b, b)
    
    // Access real and imaginary parts
    fmt.Println("Real part of a:", real(a))
    fmt.Println("Imaginary part of a:", imag(a))
}

complex 函数在给出 float32 参数时创建 complex64 值。realimag 函数用于提取实部和虚部。

复数算术运算

Complex64 值支持标准的算术运算。此示例展示了复数的で基本算术运算。

complex_arithmetic.go
package main

import "fmt"

func main() {

    x := complex(2.0, 3.0)
    y := complex(1.0, -1.0)
    
    // Addition
    sum := x + y
    fmt.Println("Sum:", sum) // (3+2i)
    
    // Subtraction
    diff := x - y
    fmt.Println("Difference:", diff) // (1+4i)
    
    // Multiplication
    product := x * y
    fmt.Println("Product:", product) // (5+1i)
    
    // Division
    quotient := x / y
    fmt.Println("Quotient:", quotient) // (-0.5+2.5i)
}

复数运算遵循标准的数学规则。运算在各个分量上进行,同时遵循虚数单位的性质。

复共轭和模

常见的复数运算包括共轭和模。此示例展示了如何计算这些属性。

complex_properties.go
package main

import (
    "fmt"
    "math"
)

func magnitude(c complex64) float32 {
    r := real(c)
    i := imag(c)
    return float32(math.Sqrt(float64(r*r + i*i)))
}

func main() {

    z := complex(4.0, 3.0)
    
    // Complex conjugate
    conjugate := complex(real(z), -imag(z))
    fmt.Println("Conjugate:", conjugate) // (4-3i)
    
    // Magnitude (absolute value)
    fmt.Println("Magnitude:", magnitude(z)) // 5
    
    // Built-in complex64 operations
    fmt.Println("Built-in magnitude:", cmplx.Abs(z))
}

共轭会改变虚部的符号。模是使用勾股定理计算的。Go 的 math/cmplx 包提供了这些运算。

在函数中使用 complex64

Complex64 值可以作为参数传递给函数并从函数返回。此示例演示了复数函数的使用。

complex_functions.go
package main

import (
    "fmt"
    "math/cmplx"
)

func rotate(c complex64, angle float32) complex64 {
    // Convert angle to radians
    rad := complex(0, float32(cmplx.Pi)*angle/180)
    return c * cmplx.Exp(rad)
}

func main() {

    point := complex(1.0, 0.0)
    
    // Rotate 90 degrees
    rotated := rotate(point, 90)
    fmt.Println("After 90° rotation:", rotated) // ~(0+1i)
    
    // Rotate another 90 degrees
    rotated = rotate(rotated, 90)
    fmt.Println("After 180° rotation:", rotated) // ~(-1+0i)
}

rotate 函数按给定角度旋转复数。复数自然地表示 2D 点和旋转。

信号处理中的 Complex64

复数是信号处理中的基本概念。此示例显示了一个基本的傅立叶变换模拟。

signal_processing.go
package main

import (
    "fmt"
    "math"
)

func dft(signal []complex64) []complex64 {
    N := len(signal)
    spectrum := make([]complex64, N)
    
    for k := 0; k < N; k++ {
        var sum complex64
        for n := 0; n < N; n++ {
            angle := -2 * math.Pi * float64(k*n) / float64(N)
            c := complex(float32(math.Cos(angle)), float32(math.Sin(angle)))
            sum += signal[n] * c
        }
        spectrum[k] = sum
    }
    return spectrum
}

func main() {

    // Create a simple signal (sine wave)
    signal := make([]complex64, 8)
    for i := range signal {
        signal[i] = complex(float32(math.Sin(2*math.Pi*float64(i)/8)), 0)
    }
    
    // Compute DFT
    spectrum := dft(signal)
    
    fmt.Println("Signal:", signal)
    fmt.Println("Spectrum:", spectrum)
}

此离散傅立叶变换实现使用 complex64 进行高效存储。每个频率分量都表示为复数。

来源

Go 语言规范

本教程通过复数运算和应用的实际示例,涵盖了 Go 中的 complex64 类型。

作者

我叫 Jan Bodnar,是一名充满激情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有超过十年的经验。

列出所有 Golang 教程