complex64, complex128, complex, real și imag în Go

Numere complexe predefinite: complex128 (două float64), complex64 (două float32) și funcțiile complex, real, imag.

Sintaxă
func complex(r, i FloatType) ComplexType
func real(c ComplexType) FloatType
func imag(c ComplexType) FloatType

z := 3 + 4i          // complex128
w := complex(1, 2)  // 1+2i

Ce face complex64, complex128, complex, real și imag

Go are numere complexe direct în limbaj. complex128 are partea reală și cea imaginară de tip float64, iar complex64 de tip float32. Un literal cu i la final este imaginar: z := 3 + 4i creează un complex128. Operatorii + - * / și == funcționează normal.

complex(r, i) construiește un număr complex din două numere reale, iar real(z) și imag(z) extrag cele două părți. Pachetul math/cmplx oferă modulul (cmplx.Abs), faza, rădăcina pătrată, exponențiala și altele. Numerele complexe apar în electrotehnică, procesarea semnalelor și fractali.

Parametri

Parametru Descriere
r, i Partea reală și cea imaginară, ambele float32 sau ambele float64.
c Un număr complex.

Ce returnează

complex: un complex64 sau complex128. real/imag: un float32 sau float64.

Exemple

Exemplul 1: Operații cu numere complexe

package main

import (
    "fmt"
    "math/cmplx"
)

func main() {
    z := 3 + 4i
    w := complex(1, -2)
    fmt.Println(z+w, z*w, z/w)
    fmt.Println("real:", real(z), "imag:", imag(z))
    fmt.Println("modul:", cmplx.Abs(z))
    fmt.Println("rădăcina lui -1:", cmplx.Sqrt(-1))
    fmt.Printf("%T %T\n", z, complex64(z))
}

Rezultat

(4+2i) (11-2i) (-1+2i)
real: 3 imag: 4
modul: 5
rădăcina lui -1: (0+1i)
complex128 complex64

Exemplul 2: Impedanța unui circuit RL

Z = R + jωL; modulul dă impedanța în ohmi, iar faza unghiul dintre tensiune și curent.

package main

import (
    "fmt"
    "math"
    "math/cmplx"
)

func main() {
    R := 100.0 // ohmi
    L := 0.5   // henry
    f := 50.0  // Hz
    omega := 2 * math.Pi * f
    Z := complex(R, omega*L)
    fmt.Printf("Z = %.2f\n", Z)
    fmt.Printf("|Z| = %.2f ohmi, faza = %.2f grade\n", cmplx.Abs(Z), cmplx.Phase(Z)*180/math.Pi)
}

Rezultat

Z = (100.00+157.08i)
|Z| = 186.21 ohmi, faza = 57.52 grade

Greșeli frecvente

  • complex(a, b) cu a float64 și b float32: părțile trebuie să aibă același tip (mismatched types).
  • Compararea cu <: numerele complexe nu sunt ordonate (operator < not defined on complex128).
  • Folosirea pachetului math în loc de math/cmplx: math.Sqrt nu primește numere complexe.

Comenzi înrudite