복소 켤레: conj(C99)

복소 켤레: conj(C99)

복소수 a + bi에서 허수부의 부호만 뒤집은 a - bi를 **켤레 복소수(complex conjugate)**라고 불러요. 복소수의 크기나 나눗셈을 계산할 때 짝으로 자주 등장하죠. C는 이 켤레를 구해 주는 함수로 conj를 제공해요.

출처: cppreference

본문

시그니처

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

형태 주석
float complex conjf ( float complex z ); (1) C99부터
double complex conj ( double complex z ); (2) C99부터
long double complex conjl ( long double complex z ); (3) C99부터
#define conj(z) (4) C99부터, <tgmath.h>

동작 방식

z의 허수부 부호를 뒤집어서 켤레 복소수를 계산해요.

(4)의 conj는 타입 제네릭 매크로예요. z의 타입이 float complex, double complex, long double complex, 또는 정수 타입이든 어떤 경우든 float complex 버전이 알아서 호출돼요.

반환값

z의 켤레 복소수를 반환해요.

주의할 점

conj를 쓰면 허수부가 음의 영(-0.0)인 복소수를 얻을 수 있어요. 예를 들어 C99 구현에서 I_Imaginary_I로 쓰지 않는 환경에서는 이 함수가 그런 값을 만드는 방법이 됩니다. C11부터는 이 목적을 위해 CMPLX 매크로를 쓰면 돼요.

예제

켤레를 구하고, 원래 값과 켤레의 곱이 실수(허수부 0)가 되는지 확인해 보는 코드예요.

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

int main(void)
{
    double complex z = 1.0 + 2.0*I;
    double complex z2 = conj(z);
    printf("The conjugate of %.1f%+.1fi is %.1f%+.1fi\n",
            creal(z), cimag(z), creal(z2), cimag(z2));

    printf("Their product is %.1f%+.1fi\n", creal(z*z2), cimag(z*z2));
}

출력:

The conjugate of 1.0+2.0i is 1.0-2.0i
Their product is 5.0+0.0i

1+2i의 켤레는 1-2i예요. 그리고 두 값을 곱하면 (1+2i)(1-2i) = 1+4 = 5라서 허수부가 0인 실수만 남는 걸 볼 수 있어요. 이게 바로 켤레가 나눗셈·크기 계산에 쓰이는 이유예요.

더 알아보기

  • creal, cimag: 복소수의 실수부·허수부.
  • cabs: 복소수의 절댓값(크기).