complex 매크로(C99)

complex 매크로(C99)

C에서 복소수 타입을 쓰려면 _Complex라는 키워드를 써야 해요. 그런데 _Complex는 붙임줄로 시작해서 타이핑이 좀 불편하죠. 그래서 표준이 이 키워드를 대신 쓸 수 있는 편한 이름으로 complex 매크로를 제공해요.

출처: cppreference

본문

정의

<complex.h> 헤더에 이렇게 정의돼 있어요.

형태
#define complex _Complex

동작 방식

이 매크로는 복소 타입을 나타내는 타입 지정자로 확장돼요. 즉 complex라고 쓰면 컴파일러에게 _Complex를 쓴 것과 같은 의미로 전달됩니다.

프로그램은 이 complex 매크로를 #undef로 풀고 다시 정의할 수도 있어요. 물론 그럴 일은 드물겠지만, 표준이 열어 둔 가능성이라는 점만 알아 두면 돼요.

예제

complex 매크로를 써서 복소수를 만들고 제곱을 계산해 보는 코드예요.

#include <complex.h>
#include <math.h>
#include <stdio.h>

void print_complex(const char* note, complex z)
{
    printf("%s %f%+f*i\n", note, creal(z), cimag(z));
}

int main(void)
{
    double complex z = -1.0 + 2.0*I;
    print_complex("z  =", z);
    print_complex("z² =", z * z);
    double complex z2 = ccos(2.0 * carg(z)) + csin(2.0 * carg(z))*I;
    print_complex("z² =", cabs(z) * cabs(z) * z2);
}

출력:

z  = -1.000000+2.000000*i
z² = -3.000000-4.000000*i
z² = -3.000000-4.000000*i

첫 줄은 입력값, 둘째 줄은 직접 곱한 z*z의 결과예요. 셋째 줄은 극형식으로 다시 조립한 값인데 둘째 줄과 똑같이 나오죠. 같은 복소수 제곱인데 두 경로 모두 같은 결과로 수렴하는 걸 확인할 수 있어요.

더 알아보기

  • imaginary 매크로: 허수 타입을 나타내는 키워드 매크로.
  • <complex.h>의 복소수 연산 함수들.