복소수 다루기
복소수 다루기
Go에서 복소수를 다루려면, 실수와 허수부를 하나로 묶거나 다시 꺼내는 일이 필요할 때가 있어요. 이 단원에서는 복소수를 만들고 분해하는 세 개의 내장 함수를 살펴볼게요.
출처: Go Specification
본문
복소수를 조립하고 분해하는 함수는 세 개입니다. 내장 함수 complex는 부동소수점 실수부와 허수부로 복소수 값을 만들어 내고, real과 imag는 복소수 값에서 실수부와 허수부를 각각 꺼내 줍니다.
complex(realPart, imaginaryPart floatT) complexT
real(complexT) floatT
imag(complexT) floatT
인자와 반환 값의 타입은 서로 대응합니다. complex의 경우 두 인자가 같은 부동소수점 타입이어야 하고, 반환 타입은 대응하는 부동소수점 성분을 가진 복소수 타입이 됩니다. 즉 float32 인자에는 complex64가, float64 인자에는 complex128이 반환 타입이죠. 인자 중 하나가 비정형(untyped) 상수로 평가되면, 먼저 다른 인자의 타입으로 암시적으로 변환됩니다. 두 인자가 모두 비정형 상수로 평가되는 경우, 둘 다 복소수가 아니거나 허수부가 0이어야 하며, 이때 함수의 반환 값은 비정형 복소수 상수가 됩니다.
real과 imag의 경우, 인자는 복소수 타입이어야 하고 반환 타입은 대응하는 부동소수점 타입입니다. complex64 인자에는 float32, complex128 인자에는 float64가 됩니다. 인자가 비정형 상수로 평가되면 숫자여야 하고, 함수의 반환 값은 비정형 부동소수점 상수가 됩니다.
real과 imag 함수는 함께 complex의 역연산을 이룹니다. 그래서 복소수 타입 Z의 값 z에 대해 z == Z(complex(real(z), imag(z)))가 성립합니다.
이 함수들의 피연산자가 전부 상수라면, 반환 값도 상수입니다.
var a = complex(2, -2) // complex128
const b = complex(1.0, -1.4) // untyped complex constant 1 - 1.4i
x := float32(math.Cos(math.Pi/2)) // float32
var c64 = complex(5, -x) // complex64
var s int = complex(1, 0) // untyped complex constant 1 + 0i can be converted to int
_ = complex(1, 2<<s) // illegal: 2 assumes floating-point type, cannot shift
var rl = real(c64) // float32
var im = imag(a) // float64
const c = imag(b) // untyped constant -1.4
_ = imag(3 << s) // illegal: 3 assumes complex type, cannot shift
타입 매개변수 타입의 인자는 허용되지 않습니다.
더 알아보기
- Numeric types — 정수·부동소수점·복소수 타입의 전체 목록과 각 타입의 범위를 확인할 수 있어요.
- Conversions — 상수나 값을 다른 타입으로 바꿔 주는 변환 규칙을 다뤄요.