`cacosh`, `cacoshf`, `cacoshl` — 복소수 아크쌍곡선 코사인
cacosh, cacoshf, cacoshl — 복소수 아크쌍곡선 코사인
쌍곡선 코사인의 역함수를 복소수로 확장하면, 실수 코사인과의 관계가 드러나는 아주 아름다운 함수가 돼요. 다만 쌍곡선의 역함수는 사실 '아크(호)'가 아니라 '면적'과 관련된 함수라서 이름부터 주의가 필요한데, 그 점까지 함께 살펴볼게요.
본문
cacosh 계열 함수는 실수축을 따라 1보다 작은 값들에서 가지 자름을 두고, 복소수 z의 복소 아크쌍곡선 코사인을 계산해요.
float complex cacoshf( float complex z ); // (1) (since C99)
double complex cacosh( double complex z ); // (2) (since C99)
long double complex cacoshl( long double complex z ); // (3) (since C99)
// Defined in header <tgmath.h>
#define acosh( z ) // (4) (since C99)
1-3) 실수축을 따라 1보다 작은 값들에서 가지 자름을 갖는, 복소수 z의 복소 아크쌍곡선 코사인을 계산해요.
4) 타입 제네릭 매크로예요. z가 long double complex면 cacoshl, double complex면 cacosh, float complex면 cacoshf가 호출돼요. z가 실수·정수면 대응하는 실수 함수(acoshf, acosh, acoshl)를, 허수면 대응하는 복소수 버전을 호출하고 반환 타입은 복소수예요.
매개변수
| 매개변수 | 설명 |
|---|---|
z |
복소수 인자 |
반환값
z의 복소 아크쌍곡선 코사인을 반환하는데, 실수축 방향으로는 구간 [0; ∞), 허수축 방향으로는 구간 [−iπ; +iπ] 안쪽이에요.
오류 처리와 특수 값
오류는 math_errhandling에 따라 보고돼요. 구현이 IEEE 부동소수점 산술을 지원한다면 다음 규칙이 적용돼요.
cacosh(conj(z)) == conj(cacosh(z))z가±0+0i→ 결과는+0+iπ/2z가+x+∞i(임의의 유한x) → 결과는+∞+iπ/2z가+x+NaNi(0이 아닌 유한x) → 결과는NaN+NaNi,FE_INVALID발생 가능z가0+NaNi→ 결과는NaN±iπ/2(허수부 부호는 명시되지 않음)z가-∞+yi(양의 유한y) → 결과는+∞+iπz가+∞+yi(양의 유한y) → 결과는+∞+0iz가-∞+∞i→ 결과는+∞+3iπ/4z가+∞+∞i→ 결과는+∞+iπ/4z가±∞+NaNi→ 결과는+∞+NaNiz가NaN+yi(임의의 유한y) → 결과는NaN+NaNi,FE_INVALID발생 가능z가NaN+∞i→ 결과는+∞+NaNiz가NaN+NaNi→ 결과는NaN+NaNi
Notes
C 표준은 이 함수를 "complex arc hyperbolic cosine"이라 부르지만, 쌍곡선 함수의 역함수는 사실 **면적 함수(area functions)**예요. 인자가 호(arc)가 아니라 쌍곡선 부채꼴의 면적이거든요. 정확히는 "complex inverse hyperbolic cosine", 덜 흔하게 "complex area hyperbolic cosine"이라 불러요.
역쌍곡선 코사인은 다가 함수라서 가지 자름이 필요해요. 관례적으로 실수축의 선분 (-∞,+1)에 자름을 둬요.
역쌍곡선 코사인의 주값의 수학적 정의는 acosh z = ln(z + √(z+1) √(z-1))이에요. 모든 z에 대해 다음 관계가 성립해요.
acosh(z) = (√(z-1)/√(1-z)) · acos(z) // 또는 복소평면 상반면에서는 i · acos(z)
예시
가지 자름의 양쪽과 i·acos(z) 관계를 확인해 보는 코드예요.
#include <stdio.h>
#include <complex.h>
int main(void)
{
double complex z = cacosh(0.5);
printf("cacosh(+0.5+0i) = %f%+fi\n", creal(z), cimag(z));
double complex z2 = conj(0.5); // or cacosh(CMPLX(0.5, -0.0)) in C11
printf("cacosh(+0.5-0i) (the other side of the cut) = %f%+fi\n", creal(z2), cimag(z2));
// in upper half-plane, acosh(z) = i*acos(z)
double complex z3 = casinh(1+I);
printf("casinh(1+1i) = %f%+fi\n", creal(z3), cimag(z3));
double complex z4 = I*casin(1+I);
printf("I*asin(1+1i) = %f%+fi\n", creal(z4), cimag(z4));
}
출력:
cacosh(+0.5+0i) = 0.000000-1.047198i
cacosh(+0.5-0i) (the other side of the cut) = 0.500000-0.000000i
casinh(1+1i) = 1.061275+0.666239i
I*asin(1+1i) = -1.061275+0.666239i
0.5+0i는 가지 자름 안쪽이라 실수부가 0인 값을, 0.5-0i는 자름 반대편이라 0.5 실수부를 갖는 값을 돌려줘요. 두 결과가 완전히 다르게 나오는 게 복소 역함수 특유의 모습이에요.
표준 참조
- C11: 7.3.6.1 The cacosh functions (p: 192), 7.25 (p: 373-375), G.6.2.1 (p: 539-540), G.7 (p: 545)
- C99: 7.3.6.1 (p: 174), 7.22 (p: 335-337), G.6.2.1 (p: 474-475), G.7 (p: 480)
더 알아보기
- 복소 아크쌍곡선 사인
casinh, 복소 아크쌍곡선 탄젠트catanh와 함께 역쌍곡선 함수군을 이뤄요. - 원함수는 복소 쌍곡선 코사인
ccosh예요. - 복소 아크코사인
cacos와의 관계(acosh(z) = i·acos(z))가 핵심이에요. - 실수 역쌍곡선 코사인
acosh·acoshf·acoshl과 비교해 보세요. - cppreference의 cacosh 원문에서 참조 절을 더 확인할 수 있어요.