표준 라이브러리 헤더 <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^x
  • exp2 — 2^x
  • expm1 — e^x − 1
  • log — 자연(밑이 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>에서 수학 함수와 복소수 함수를 한데 묶어 줘요.