`_Complex_I` 매크로 — 복소 단위 상수
_Complex_I 매크로 — 복소 단위 상수
복소수를 만들 때 가장 흔히 쓰는 건 I 매크로인데, 잠깐 I를 쓸 수 없는 상황이 있을 수 있어요. 예를 들어 프로그램에서 I를 #undef로 풀어버렸다든가요. 그럴 때 쓸 수 있는 더 낮은 수준의 상수가 바로 _Complex_I예요.
본문
_Complex_I 매크로는 허수 단위의 값을 가진 const float _Complex 타입의 값으로 확장돼요.
#define _Complex_I /* unspecified */ // (since C99)
Notes
- 이 매크로는
I가 없을 때(예: 응용 프로그램이I를#undef했을 때) 쓸 수 있어요. _Imaginary_I나CMPLX와 달리, 이 매크로로 복소수를 구성하면 허수부의 영 부호가 사라질 수 있어요.
이런 한계 때문에, 음의 영을 정확히 보존해야 하는 경우에는 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_I나CMPLX를 비교해 보세요. - cppreference의 _Complex_I 원문에서 참조 절을 더 확인할 수 있어요.