복소수의 허수부: 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)**예요. 인자 zfloat 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에 담긴 두 성분을 crealcimag가 정확히 꺼내 주는 걸 볼 수 있어요. 여기서 보듯 cimag는 사실상 I의 계수인 허수부만 반환해요.

더 알아보기

  • creal: 복소수의 실수부를 반환.
  • conj: 허수부의 부호를 뒤집은 켤레 복소수를 만듦.