표준 라이브러리 헤더 <math.h>
표준 라이브러리 헤더 <math.h>
삼각함수, 로그, 거듭제곱… 수학 함수는 프로그램에서 정말 자주 쓰이는데, 단 하나의 타입(double)으로만 제공하면 float를 쓰는 코드에서는 불편해져요. <math.h>는 수학 라이브러리의 일부로, float(접미사 f), double(접미사 없음), long double(접미사 l) 세 버전의 수학 함수와 그에 필요한 상수·타입을 함께 제공해요.
출처: cppreference
본문
타입(Types)
| 타입 | 설명 |
|---|---|
float_t |
(C99) float보다 같거나 넓은, 가장 효율적인 부동소수점 타입 |
double_t |
(C99) double보다 같거나 넓은, 가장 효율적인 부동소수점 타입 |
상수(Constants)
| 상수 | 설명 |
|---|---|
HUGE_VALF, HUGE_VAL, HUGE_VALL |
(C99) 각각 float, double, long double로 표현하기엔 너무 큰 값(무한대)을 나타냄 |
INFINITY |
(C99) 양의 무한대(존재하면)로 평가 |
NAN |
(C99) float 타입의 조용한 NaN(존재하면)로 평가 |
FP_FAST_FMAF, FP_FAST_FMA, FP_FAST_FMAL |
(C99) fma 함수가 double 피연산자의 곱셈과 덧셈만큼 빠르게(또는 더 빠르게) 실행됨을 나타냄 |
FP_ILOGB0, FP_ILOGBNAN |
(C99) 각각 x가 0이나 NaN일 때 ilogb(x)가 돌려주는 값으로 평가 |
math_errhandling, MATH_ERRNO, MATH_ERREXCEPT |
(C99) 일반 수학 함수가 사용하는 오류 처리 방식을 정의 |
FP_NORMAL, FP_SUBNORMAL, FP_ZERO, FP_INFINITE, FP_NAN |
(C99) 부동소수점 범주를 나타냄 |
함수(Functions)
대부분의 함수가 double 기본형에 f/l 접미사 변형을 함께 두는데, 아래 표는 기본 형태 기준이에요.
기본 연산(Basic operations)
fabs— 부동소수점 값의 절댓값 (|x|)fmod— 부동소수점 나눗셈의 나머지remainder— 부동소수점 나눗셈의 부호 있는 나머지remquo— 부호 있는 나머지와 나눗셈 결과의 마지막 3비트fma— 융합 곱셈-덧셈(fused multiply-add)fmax— 두 부동소수점 값 중 큰 값fmin— 두 부동소수점 값 중 작은 값fdim— 두 값의 양의 차이 (max(0, x-y))nan— NaN(숫자가 아님) 반환
지수 함수(Exponential functions)
exp— e^xexp2— 2^xexpm1— e^x − 1log— 자연(밑이 e) 로그 ln(x)log10— 상용(밑이 10) 로그log2— 밑이 2인 로그log1p— 1+x의 자연 로그 ln(1+x)
거듭제곱 함수(Power functions)
pow— x의 y 거듭제곱 (x^y)sqrt— 제곱근 (√x)cbrt— 세제곱근hypot— 두 값 제곱의 합의 제곱근 (√(x²+y²))
삼각 함수(Trigonometric functions)
sin,cos,tan— 사인, 코사인, 탄젠트asin,acos,atan— 역사인, 역코사인, 역탄젠트atan2— 부호로 사분면을 판별하는 역탄젠트
쌍곡선 함수(Hyperbolic functions)
sinh,cosh,tanh— 쌍곡 사인, 코사인, 탄젠트asinh,acosh,atanh— 역쌍곡 사인, 코사인, 탄젠트
오차·감마 함수(Error and gamma functions)
erf— 오차 함수erfc— 여오차(complementary error) 함수tgamma— 감마 함수lgamma— 감마 함수의 자연 로그
정수 반올림 연산(Nearest integer floating-point operations)
ceil— 주어진 값보다 작지 않은 가장 작은 정수floor— 주어진 값보다 크지 않은 가장 큰 정수trunc— 크기가 주어진 값보다 크지 않은 가장 가까운 정수로 반올림round— 반올림(중간값은 0에서 멀어지는 방향)nearbyint— 현재 반올림 모드를 사용해 정수로 반올림rint— 현재 반올림 모드로 반올림하되, 결과가 다르면 예외 발생
부동소수점 조작 함수(Floating-point manipulation functions)
frexp— 수를 가수(significand)와 2의 거듭제곱으로 분해ldexp— 수에 2의 거듭제곱을 곱함modf— 수를 정수 부분과 소수 부분으로 분해scalbn/scalbln— 수에FLT_RADIX의 거듭제곱을 효율적으로 곱함ilogb— 주어진 수의 지수 추출logb— 주어진 수의 지수 추출nextafter/nexttoward— 주어진 값 방향으로의 다음 표현 가능한 값 판별nextup/nextdown— (C23) 주어진 값보다 크거나 작은 다음 표현 가능한 값 판별copysign— 한 값의 크기와 다른 값의 부호를 가진 값을 생성
분류·비교(Classification and comparison)
fpclassify— (C99) 주어진 부동소수점 값을 분류isfinite— (C99) 유한 값인지 검사isinf— (C99) 무한대인지 검사isnan— (C99) NaN인지 검사isnormal— (C99) 정규 값인지 검사signbit— (C99) 음수인지 검사isgreater— (C99) 첫 인자가 두 번째보다 큰지 검사isgreaterequal— (C99) 첫 인자가 두 번째보다 크거나 같은지 검사isless— (C99) 첫 인자가 두 번째보다 작은지 검사islessequal— (C99) 첫 인자가 두 번째보다 작거나 같은지 검사islessgreater— (C99) 첫 인자가 두 번째보다 작거나 큰지 검사isunordered— (C99) 두 값이 순서 없음(unordered)인지 검사
이 비교 계열 매크로들은 NaN을 만나도 예외를 던지지 않는 것이 특징이에요. 일반 비교 연산자가 NaN 때문에 까다로울 때 유용하죠.
시그니처(Synopsis)
cppreference의 <math.h> 시그니처 섹션은 아직 채워지지 않아요. 다만 각 함수가 float/double/long double 세 변형으로 제공된다는 것을 기억하면 충분해요.
#define __STDC_VERSION_MATH_H__ 202311L
더 알아보기
- 수학 함수의 오류 보고 방식(
errno, 예외)은<errno.h>와<fenv.h>에서 다뤄요. - 타입 제네릭 매크로는
<tgmath.h>에서 수학 함수와 복소수 함수를 한데 묶어 줘요.