ZetCode

Golang ComplexType

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

本教程将讲解如何在 Go 中使用 ComplexType 内置类型。我们将通过复数运算的实际示例来介绍复数基础知识。

Go 中的 ComplexType 表示具有浮点数分量的复数。Go 提供了两种复数类型:complex64complex128。它们分别对应 32 位和 64 位浮点数分量。

复数在科学计算、信号处理和图形学中非常有用。Go 提供了用于创建和操作复数的内置函数。如果需要,还可以单独访问实部和虚部。

基本复数创建

创建复数的最简单方法是使用 complex 函数。此示例演示了基本的复数创建和分量访问。
注意: 复数文字使用 (a+bi) 格式。

basic_complex.go
package main

import "fmt"

func main() {

    // Create complex numbers
    a := complex(2, 3)    // 2 + 3i
    b := 4 + 5i           // Literal syntax
    
    // Access components
    realA := real(a)
    imagA := imag(a)
    
    fmt.Println("a =", a)
    fmt.Println("b =", b)
    fmt.Printf("Real part of a: %.1f\n", realA)
    fmt.Printf("Imaginary part of a: %.1f\n", imagA)
}

complex 函数根据两个浮点数创建复数。可以使用 realimag 访问实部和虚部。复数文字提供了方便的初始化语法。

复数算术运算

复数支持标准的算术运算,如加法和乘法。此示例展示了复数的基本算术运算。

complex_arithmetic.go
package main

import "fmt"

func main() {

    a := 3 + 4i
    b := 1 + 2i
    
    // Arithmetic operations
    sum := a + b
    difference := a - b
    product := a * b
    quotient := a / b
    
    fmt.Println("a + b =", sum)
    fmt.Println("a - b =", difference)
    fmt.Println("a * b =", product)
    fmt.Println("a / b =", quotient)
}

复数运算遵循复数的标准数学规则。乘法和除法使用公式 (a+bi)(c+di) = (ac-bd)+(ad+bc)i。如果混合类型,结果会自动提升到较大的类型。

复数比较

复数可以进行相等性比较,但不能进行顺序比较。此示例演示了复数的比较运算。

complex_comparison.go
package main

import "fmt"

func main() {

    a := 3.0 + 4i
    b := 3.0 + 4i
    c := 3.1 + 4i
    
    // Equality comparison
    fmt.Println("a == b:", a == b)
    fmt.Println("a == c:", a == c)
    
    // Note: No ordering operators (<, >, etc.)
    // fmt.Println("a < c:", a < c) // Compile error
}

当实部和虚部都相等时,复数才相等。Go 不支持复数的顺序运算符(<, >)。这符合复数比较的数学惯例。

复数数学函数

math/cmplx 包提供了高级复数函数。此示例演示了常见的复数数学运算。

complex_math.go
package main

import (
    "fmt"
    "math/cmplx"
)

func main() {

    z := 3 + 4i
    
    // Complex math operations
    conjugate := cmplx.Conj(z)
    absolute := cmplx.Abs(z)
    phase := cmplx.Phase(z)
    sqrt := cmplx.Sqrt(z)
    
    fmt.Println("z =", z)
    fmt.Println("Conjugate:", conjugate)
    fmt.Printf("Absolute value: %.2f\n", absolute)
    fmt.Printf("Phase angle: %.2f radians\n", phase)
    fmt.Println("Square root:", sqrt)
}

math/cmplx 包提供了 ConjAbsSqrt 等函数。这些函数实现了标准的数学复数运算。该包还包括三角函数、指数函数和对数函数。

复数的实际应用

复数对于求解二次方程很有用。此示例演示了使用复数来求解方程的根。

quadratic_roots.go
package main

import (
    "fmt"
    "math/cmplx"
)

func quadraticRoots(a, b, c float64) (complex128, complex128) {
    discriminant := b*b - 4*a*c
    sqrtDiscriminant := cmplx.Sqrt(complex(discriminant, 0))
    
    root1 := (-complex(b, 0) + sqrtDiscriminant) / complex(2*a, 0)
    root2 := (-complex(b, 0) - sqrtDiscriminant) / complex(2*a, 0)
    
    return root1, root2
}

func main() {

    // Real roots
    r1, r2 := quadraticRoots(1, -3, 2)
    fmt.Println("Roots of x² - 3x + 2 = 0:")
    fmt.Println("Root 1:", r1)
    fmt.Println("Root 2:", r2)
    
    // Complex roots
    r1, r2 = quadraticRoots(1, 0, 1)
    fmt.Println("\nRoots of x² + 1 = 0:")
    fmt.Println("Root 1:", r1)
    fmt.Println("Root 2:", r2)
}

复数可以求解判别式为负的二次方程。同一个函数可同时处理实数根和复数根。这展示了复数在计算中的实际价值。

来源

Go 语言规范

本教程通过复数创建、运算和应用的实际示例,讲解了 Go 中的 ComplexType

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Golang 教程