`_Complex_I` 매크로 — 복소 단위 상수

_Complex_I 매크로 — 복소 단위 상수

복소수를 만들 때 가장 흔히 쓰는 건 I 매크로인데, 잠깐 I를 쓸 수 없는 상황이 있을 수 있어요. 예를 들어 프로그램에서 I#undef로 풀어버렸다든가요. 그럴 때 쓸 수 있는 더 낮은 수준의 상수가 바로 _Complex_I예요.

출처: cppreference — _Complex_I

본문

_Complex_I 매크로는 허수 단위의 값을 가진 const float _Complex 타입의 값으로 확장돼요.

#define _Complex_I /* unspecified */   // (since C99)

Notes

  • 이 매크로는 I가 없을 때(예: 응용 프로그램이 I#undef했을 때) 쓸 수 있어요.
  • _Imaginary_ICMPLX와 달리, 이 매크로로 복소수를 구성하면 허수부의 영 부호가 사라질 수 있어요.

이런 한계 때문에, 음의 영을 정확히 보존해야 하는 경우에는 CMPLX를 쓰는 게 좋아요.

예시

I#undef한 뒤 J_Complex_I를 재정의해 복소수를 만들어 보는 코드예요.

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

#undef I
#define J _Complex_I // can be used to redefine I

int main(void)
{
    // can be used to construct a complex number
    double complex z = 1.0 + 2.0 * _Complex_I;
    printf("1.0 + 2.0 * _Complex_I = %.1f%+.1fi\n", creal(z), cimag(z));

    // sign of zero may not be preserved
    double complex z2 = 0.0 + -0.0 * _Complex_I;
    printf("0.0 + -0.0 * _Complex_I = %.1f%+.1fi\n", creal(z2), cimag(z2));
}

가능한 출력:

1.0 + 2.0 * _Complex_I = 1.0+2.0i
0.0 + -0.0 * _Complex_I = 0.0+0.0i

두 번째 출력을 보면, -0.0 * _Complex_I를 만들었는데도 허수부가 +0.0i로 나와요. 이게 "_Complex_I는 영의 부호를 보존하지 않을 수 있다"는 말이 실제로 드러나는 지점이에요.

표준 참조

  • C23: 7.3.1/4 _Complex_I
  • C17: 7.3.1/4 _Complex_I (p: 136)
  • C11: 7.3.1/4 _Complex_I (p: 188)
  • C99: 7.3.1/2 _Complex_I (p: 170)

더 알아보기

  • 보통은 I 매크로(_Complex_I 또는 _Imaginary_I로 확장)로 복소수를 만들어요.
  • 영 부호를 정확히 보존해야 한다면 _Imaginary_ICMPLX를 비교해 보세요.
  • cppreference의 _Complex_I 원문에서 참조 절을 더 확인할 수 있어요.