티스토리 뷰
☞ exp, exp2, exp10, log, log2, log10, pow, sqrt, cbrt, hypot, expm1, log1p
<math.h>
double exp(double x);
float expf(float x);
long double expl(long double x);
double exp2(double x);
float exp2f(float x);
long double exp2l(long double x);
double exp10(double x);
float exp10f(float x);
long double exp10l(long double x);
double log(double x);
float logf(float x);
long double logl(long double x);
double log2(double x);
float log2f(float x);
long double log2l(long double x);
double log10(double x);
float log10f(float x);
long double log10l(long double x);
double pow(double base, double power);
float powf(float base, float power);
long double powl(long double base, long double power);
double sqrt(double x);
float sqrtf(float x);
long double sqrtl(long double x);
double cbrt(double x);
float cbrtf(float x);
long double cbrtl(long double x);
double hypot(double x, double y);
float hypotf(float x, float y);
long double hypotl(long double x, long double y);
double expm1(double x);
float expm1f(float x);
long double expm1l(long double x);
double log1p(double x);
float log1pf(float x);
long double log1pl(long double x);
부동 소수점수를 표현하는 C언어의 타입으로는 float, double, long double 등이 있는데 기본적인 지수 및 로그 함수들(exp, exp2, exp10, log, log2, log10, pow, sqrt, cbrt, hypot, expm1, log1p)은 double 타입을 사용합니다.
기본적인 함수에 더해서 float 타입은 접미어로 -f를 붙인 함수를, long double 타입은 접미어로 -l을 붙인 함수를 사용할 수 있습니다.
CPU 및 운영체제에 따라 다르지만 float < double < long double 순으로 데이터 타입 표현에 더 많은 메모리를 사용하므로 정밀도는 높아지는 대신 연산 속도가 떨어지는 단점이 있습니다.
용도에 맞는 부동 소수점 타입과 함수를 선택하는 것이 좋습니다.
exp()는 e(2.718282)의 x승, exp2()는 2의 x승, exp10()은 10의 x승을 리턴하고 pow()는 base의 power 승을 리턴합니다.
log()는 e 기반, log2()는 2기반, log10()은 10 기반의 로그값을 리턴합니다. 수학적으로는 exp(log(x))는 정확하게 x이지만 C 언어의 결과는 x의 근사치입니다.
sqrt()는 x의 제곱근, cbrt()는 x의 세제곱근 hypot()은 sqrt(x*x + y*y) 값을 리턴합니다.
expm1()은 exp(x) - 1 값을, log1p()는 log(1 + x) 값을 리턴합니다.
☞ 예제1
double pg_hypot(double x, double y) { double yx; /* Handle INF and NaN properly */ if (isinf(x) || isinf(y)) return get_float8_infinity(); if (isnan(x) || isnan(y)) return get_float8_nan(); /* Else, drop any minus signs */ x = fabs(x); y = fabs(y); /* Swap x and y if needed to make x the larger one */ if (x < y) { double temp = x; x = y; y = temp; } /* * If y is zero, the hypotenuse is x. This test saves a few cycles in * such cases, but more importantly it also protects against * divide-by-zero errors, since now x >= y. */ if (y == 0.0) return x; /* Determine the hypotenuse */ yx = y / x; return x * sqrt(1.0 + (yx * yx)); }
위의 코드는 PostgreSQL DBMS의 코드 일부로 hypot() 함수를 나름 구현해서 사용하고 있는 예제입니다.