복소수의 허수부: cimag(C99)
복소수의 허수부: cimag(C99)
복소수를 다루다 보면 실수부와 허수부를 각각 꺼내고 싶을 때가 있어요. 이 값들은 지금 곧바로 쓰면 되는 건 아니지만, 출력할 때나 연산 결과를 확인할 때 자주 필요하죠. 그 역할을 하는 함수 중 하나가 cimag예요. 이름 그대로 복소수의 허수부(imaginary part)를 돌려줍니다.
출처: cppreference
본문
시그니처
<complex.h> 헤더에 정의돼 있어요.
| 형태 | 주석 |
|---|---|
float cimagf ( float complex z ); |
(1) C99부터 |
double cimag ( double complex z ); |
(2) C99부터 |
long double cimagl ( long double complex z ); |
(3) C99부터 |
#define cimag(z) |
(4) C99부터, <tgmath.h> |
동작 방식
z의 허수부를 반환해요.
그런데 여기서 재미있는 게 있어요. (4)의 cimag는 함수가 아니라 **타입 제네릭 매크로(type-generic macro)**예요. 인자 z가 float complex, double complex, long double complex든 어떤 타입이든, 아니면 정수 타입이어도 알아서 맞는 소수점 버전 호출해 줍니다.
이 함수는 모든 가능한 입력에 대해 완전히 규정돼 있어요. 즉 math_errhandling에 설명된 어떤 오류에도 걸리지 않는 함수예요.
주의할 점
임의의 복소수 변수 z에 대해 다음 식이 항상 성립해요.
z == creal(z) + I * cimag(z)
다시 말해 복소수를 실수부과 허수부로 나눠서 다시 조립하면 원래 값과 같다는 뜻이에요.
예제
복소수를 만들고 실수부·허수부를 분리해 출력해 보는 코드예요.
#include <stdio.h>
#include <complex.h>
int main(void)
{
double complex z = 1.0 + 2.0*I;
printf("%f%+fi\n", creal(z), cimag(z));
}
출력:
1.000000+2.000000i
복소수 리터럴 1.0 + 2.0*I에 담긴 두 성분을 creal과 cimag가 정확히 꺼내 주는 걸 볼 수 있어요. 여기서 보듯 cimag는 사실상 I의 계수인 허수부만 반환해요.
더 알아보기
creal: 복소수의 실수부를 반환.conj: 허수부의 부호를 뒤집은 켤레 복소수를 만듦.