# 28 Numerics library [numerics]

## 28.7 Mathematical functions for floating-point types [c.math]

### 28.7.1 Header <cmath> synopsis [cmath.syn]

namespace std { using float_t = see below; using double_t = see below; } #define HUGE_VAL see below #define HUGE_VALF see below #define HUGE_VALL see below #define INFINITY see below #define NAN see below #define FP_INFINITE see below #define FP_NAN see below #define FP_NORMAL see below #define FP_SUBNORMAL see below #define FP_ZERO see below #define FP_FAST_FMA see below #define FP_FAST_FMAF see below #define FP_FAST_FMAL see below #define FP_ILOGB0 see below #define FP_ILOGBNAN see below #define MATH_ERRNO see below #define MATH_ERREXCEPT see below #define math_errhandling see below namespace std { float acos(float x); // see [library.c] double acos(double x); long double acos(long double x); // see [library.c] float acosf(float x); long double acosl(long double x); float asin(float x); // see [library.c] double asin(double x); long double asin(long double x); // see [library.c] float asinf(float x); long double asinl(long double x); float atan(float x); // see [library.c] double atan(double x); long double atan(long double x); // see [library.c] float atanf(float x); long double atanl(long double x); float atan2(float y, float x); // see [library.c] double atan2(double y, double x); long double atan2(long double y, long double x); // see [library.c] float atan2f(float y, float x); long double atan2l(long double y, long double x); float cos(float x); // see [library.c] double cos(double x); long double cos(long double x); // see [library.c] float cosf(float x); long double cosl(long double x); float sin(float x); // see [library.c] double sin(double x); long double sin(long double x); // see [library.c] float sinf(float x); long double sinl(long double x); float tan(float x); // see [library.c] double tan(double x); long double tan(long double x); // see [library.c] float tanf(float x); long double tanl(long double x); float acosh(float x); // see [library.c] double acosh(double x); long double acosh(long double x); // see [library.c] float acoshf(float x); long double acoshl(long double x); float asinh(float x); // see [library.c] double asinh(double x); long double asinh(long double x); // see [library.c] float asinhf(float x); long double asinhl(long double x); float atanh(float x); // see [library.c] double atanh(double x); long double atanh(long double x); // see [library.c] float atanhf(float x); long double atanhl(long double x); float cosh(float x); // see [library.c] double cosh(double x); long double cosh(long double x); // see [library.c] float coshf(float x); long double coshl(long double x); float sinh(float x); // see [library.c] double sinh(double x); long double sinh(long double x); // see [library.c] float sinhf(float x); long double sinhl(long double x); float tanh(float x); // see [library.c] double tanh(double x); long double tanh(long double x); // see [library.c] float tanhf(float x); long double tanhl(long double x); float exp(float x); // see [library.c] double exp(double x); long double exp(long double x); // see [library.c] float expf(float x); long double expl(long double x); float exp2(float x); // see [library.c] double exp2(double x); long double exp2(long double x); // see [library.c] float exp2f(float x); long double exp2l(long double x); float expm1(float x); // see [library.c] double expm1(double x); long double expm1(long double x); // see [library.c] float expm1f(float x); long double expm1l(long double x); constexpr float frexp(float value, int* exp); // see [library.c] constexpr double frexp(double value, int* exp); constexpr long double frexp(long double value, int* exp); // see [library.c] constexpr float frexpf(float value, int* exp); constexpr long double frexpl(long double value, int* exp); constexpr int ilogb(float x); // see [library.c] constexpr int ilogb(double x); constexpr int ilogb(long double x); // see [library.c] constexpr int ilogbf(float x); constexpr int ilogbl(long double x); constexpr float ldexp(float x, int exp); // see [library.c] constexpr double ldexp(double x, int exp); constexpr long double ldexp(long double x, int exp); // see [library.c] constexpr float ldexpf(float x, int exp); constexpr long double ldexpl(long double x, int exp); float log(float x); // see [library.c] double log(double x); long double log(long double x); // see [library.c] float logf(float x); long double logl(long double x); float log10(float x); // see [library.c] double log10(double x); long double log10(long double x); // see [library.c] float log10f(float x); long double log10l(long double x); float log1p(float x); // see [library.c] double log1p(double x); long double log1p(long double x); // see [library.c] float log1pf(float x); long double log1pl(long double x); float log2(float x); // see [library.c] double log2(double x); long double log2(long double x); // see [library.c] float log2f(float x); long double log2l(long double x); constexpr float logb(float x); // see [library.c] constexpr double logb(double x); constexpr long double logb(long double x); // see [library.c] constexpr float logbf(float x); constexpr long double logbl(long double x); constexpr float modf(float value, float* iptr); // see [library.c] constexpr double modf(double value, double* iptr); constexpr long double modf(long double value, long double* iptr); // see [library.c] constexpr float modff(float value, float* iptr); constexpr long double modfl(long double value, long double* iptr); constexpr float scalbn(float x, int n); // see [library.c] constexpr double scalbn(double x, int n); constexpr long double scalbn(long double x, int n); // see [library.c] constexpr float scalbnf(float x, int n); constexpr long double scalbnl(long double x, int n); constexpr float scalbln(float x, long int n); // see [library.c] constexpr double scalbln(double x, long int n); constexpr long double scalbln(long double x, long int n); // see [library.c] constexpr float scalblnf(float x, long int n); constexpr long double scalblnl(long double x, long int n); float cbrt(float x); // see [library.c] double cbrt(double x); long double cbrt(long double x); // see [library.c] float cbrtf(float x); long double cbrtl(long double x); // [c.math.abs], absolute values constexpr int abs(int j); constexpr long int abs(long int j); constexpr long long int abs(long long int j); constexpr float abs(float j); constexpr double abs(double j); constexpr long double abs(long double j); constexpr float fabs(float x); // see [library.c] constexpr double fabs(double x); constexpr long double fabs(long double x); // see [library.c] constexpr float fabsf(float x); constexpr long double fabsl(long double x); float hypot(float x, float y); // see [library.c] double hypot(double x, double y); long double hypot(long double x, long double y); // see [library.c] float hypotf(float x, float y); long double hypotl(long double x, long double y); // [c.math.hypot3], three-dimensional hypotenuse float hypot(float x, float y, float z); double hypot(double x, double y, double z); long double hypot(long double x, long double y, long double z); float pow(float x, float y); // see [library.c] double pow(double x, double y); long double pow(long double x, long double y); // see [library.c] float powf(float x, float y); long double powl(long double x, long double y); float sqrt(float x); // see [library.c] double sqrt(double x); long double sqrt(long double x); // see [library.c] float sqrtf(float x); long double sqrtl(long double x); float erf(float x); // see [library.c] double erf(double x); long double erf(long double x); // see [library.c] float erff(float x); long double erfl(long double x); float erfc(float x); // see [library.c] double erfc(double x); long double erfc(long double x); // see [library.c] float erfcf(float x); long double erfcl(long double x); float lgamma(float x); // see [library.c] double lgamma(double x); long double lgamma(long double x); // see [library.c] float lgammaf(float x); long double lgammal(long double x); float tgamma(float x); // see [library.c] double tgamma(double x); long double tgamma(long double x); // see [library.c] float tgammaf(float x); long double tgammal(long double x); constexpr float ceil(float x); // see [library.c] constexpr double ceil(double x); constexpr long double ceil(long double x); // see [library.c] constexpr float ceilf(float x); constexpr long double ceill(long double x); constexpr float floor(float x); // see [library.c] constexpr double floor(double x); constexpr long double floor(long double x); // see [library.c] constexpr float floorf(float x); constexpr long double floorl(long double x); float nearbyint(float x); // see [library.c] double nearbyint(double x); long double nearbyint(long double x); // see [library.c] float nearbyintf(float x); long double nearbyintl(long double x); float rint(float x); // see [library.c] double rint(double x); long double rint(long double x); // see [library.c] float rintf(float x); long double rintl(long double x); long int lrint(float x); // see [library.c] long int lrint(double x); long int lrint(long double x); // see [library.c] long int lrintf(float x); long int lrintl(long double x); long long int llrint(float x); // see [library.c] long long int llrint(double x); long long int llrint(long double x); // see [library.c] long long int llrintf(float x); long long int llrintl(long double x); constexpr float round(float x); // see [library.c] constexpr double round(double x); constexpr long double round(long double x); // see [library.c] constexpr float roundf(float x); constexpr long double roundl(long double x); constexpr long int lround(float x); // see [library.c] constexpr long int lround(double x); constexpr long int lround(long double x); // see [library.c] constexpr long int lroundf(float x); constexpr long int lroundl(long double x); constexpr long long int llround(float x); // see [library.c] constexpr long long int llround(double x); constexpr long long int llround(long double x); // see [library.c] constexpr long long int llroundf(float x); constexpr long long int llroundl(long double x); constexpr float trunc(float x); // see [library.c] constexpr double trunc(double x); constexpr long double trunc(long double x); // see [library.c] constexpr float truncf(float x); constexpr long double truncl(long double x); constexpr float fmod(float x, float y); // see [library.c] constexpr double fmod(double x, double y); constexpr long double fmod(long double x, long double y); // see [library.c] constexpr float fmodf(float x, float y); constexpr long double fmodl(long double x, long double y); constexpr float remainder(float x, float y); // see [library.c] constexpr double remainder(double x, double y); constexpr long double remainder(long double x, long double y); // see [library.c] constexpr float remainderf(float x, float y); constexpr long double remainderl(long double x, long double y); constexpr float remquo(float x, float y, int* quo); // see [library.c] constexpr double remquo(double x, double y, int* quo); constexpr long double remquo(long double x, long double y, int* quo); // see [library.c] constexpr float remquof(float x, float y, int* quo); constexpr long double remquol(long double x, long double y, int* quo); constexpr float copysign(float x, float y); // see [library.c] constexpr double copysign(double x, double y); constexpr long double copysign(long double x, long double y); // see [library.c] constexpr float copysignf(float x, float y); constexpr long double copysignl(long double x, long double y); double nan(const char* tagp); float nanf(const char* tagp); long double nanl(const char* tagp); constexpr float nextafter(float x, float y); // see [library.c] constexpr double nextafter(double x, double y); constexpr long double nextafter(long double x, long double y); // see [library.c] constexpr float nextafterf(float x, float y); constexpr long double nextafterl(long double x, long double y); constexpr float nexttoward(float x, long double y); // see [library.c] constexpr double nexttoward(double x, long double y); constexpr long double nexttoward(long double x, long double y); // see [library.c] constexpr float nexttowardf(float x, long double y); constexpr long double nexttowardl(long double x, long double y); constexpr float fdim(float x, float y); // see [library.c] constexpr double fdim(double x, double y); constexpr long double fdim(long double x, long double y); // see [library.c] constexpr float fdimf(float x, float y); constexpr long double fdiml(long double x, long double y); constexpr float fmax(float x, float y); // see [library.c] constexpr double fmax(double x, double y); constexpr long double fmax(long double x, long double y); // see [library.c] constexpr float fmaxf(float x, float y); constexpr long double fmaxl(long double x, long double y); constexpr float fmin(float x, float y); // see [library.c] constexpr double fmin(double x, double y); constexpr long double fmin(long double x, long double y); // see [library.c] constexpr float fminf(float x, float y); constexpr long double fminl(long double x, long double y); constexpr float fma(float x, float y, float z); // see [library.c] constexpr double fma(double x, double y, double z); constexpr long double fma(long double x, long double y, long double z); // see [library.c] constexpr float fmaf(float x, float y, float z); constexpr long double fmal(long double x, long double y, long double z); // [c.math.lerp], linear interpolation constexpr float lerp(float a, float b, float t) noexcept; constexpr double lerp(double a, double b, double t) noexcept; constexpr long double lerp(long double a, long double b, long double t) noexcept; // [c.math.fpclass], classification / comparison functions constexpr int fpclassify(float x); constexpr int fpclassify(double x); constexpr int fpclassify(long double x); constexpr bool isfinite(float x); constexpr bool isfinite(double x); constexpr bool isfinite(long double x); constexpr bool isinf(float x); constexpr bool isinf(double x); constexpr bool isinf(long double x); constexpr bool isnan(float x); constexpr bool isnan(double x); constexpr bool isnan(long double x); constexpr bool isnormal(float x); constexpr bool isnormal(double x); constexpr bool isnormal(long double x); constexpr bool signbit(float x); constexpr bool signbit(double x); constexpr bool signbit(long double x); constexpr bool isgreater(float x, float y); constexpr bool isgreater(double x, double y); constexpr bool isgreater(long double x, long double y); constexpr bool isgreaterequal(float x, float y); constexpr bool isgreaterequal(double x, double y); constexpr bool isgreaterequal(long double x, long double y); constexpr bool isless(float x, float y); constexpr bool isless(double x, double y); constexpr bool isless(long double x, long double y); constexpr bool islessequal(float x, float y); constexpr bool islessequal(double x, double y); constexpr bool islessequal(long double x, long double y); constexpr bool islessgreater(float x, float y); constexpr bool islessgreater(double x, double y); constexpr bool islessgreater(long double x, long double y); constexpr bool isunordered(float x, float y); constexpr bool isunordered(double x, double y); constexpr bool isunordered(long double x, long double y); // [sf.cmath], mathematical special functions // [sf.cmath.assoc.laguerre], associated Laguerre polynomials double assoc_laguerre(unsigned n, unsigned m, double x); float assoc_laguerref(unsigned n, unsigned m, float x); long double assoc_laguerrel(unsigned n, unsigned m, long double x); // [sf.cmath.assoc.legendre], associated Legendre functions double assoc_legendre(unsigned l, unsigned m, double x); float assoc_legendref(unsigned l, unsigned m, float x); long double assoc_legendrel(unsigned l, unsigned m, long double x); // [sf.cmath.beta], beta function double beta(double x, double y); float betaf(float x, float y); long double betal(long double x, long double y); // [sf.cmath.comp.ellint.1], complete elliptic integral of the first kind double comp_ellint_1(double k); float comp_ellint_1f(float k); long double comp_ellint_1l(long double k); // [sf.cmath.comp.ellint.2], complete elliptic integral of the second kind double comp_ellint_2(double k); float comp_ellint_2f(float k); long double comp_ellint_2l(long double k); // [sf.cmath.comp.ellint.3], complete elliptic integral of the third kind double comp_ellint_3(double k, double nu); float comp_ellint_3f(float k, float nu); long double comp_ellint_3l(long double k, long double nu); // [sf.cmath.cyl.bessel.i], regular modified cylindrical Bessel functions double cyl_bessel_i(double nu, double x); float cyl_bessel_if(float nu, float x); long double cyl_bessel_il(long double nu, long double x); // [sf.cmath.cyl.bessel.j], cylindrical Bessel functions of the first kind double cyl_bessel_j(double nu, double x); float cyl_bessel_jf(float nu, float x); long double cyl_bessel_jl(long double nu, long double x); // [sf.cmath.cyl.bessel.k], irregular modified cylindrical Bessel functions double cyl_bessel_k(double nu, double x); float cyl_bessel_kf(float nu, float x); long double cyl_bessel_kl(long double nu, long double x); // [sf.cmath.cyl.neumann], cylindrical Neumann functions; // cylindrical Bessel functions of the second kind double cyl_neumann(double nu, double x); float cyl_neumannf(float nu, float x); long double cyl_neumannl(long double nu, long double x); // [sf.cmath.ellint.1], incomplete elliptic integral of the first kind double ellint_1(double k, double phi); float ellint_1f(float k, float phi); long double ellint_1l(long double k, long double phi); // [sf.cmath.ellint.2], incomplete elliptic integral of the second kind double ellint_2(double k, double phi); float ellint_2f(float k, float phi); long double ellint_2l(long double k, long double phi); // [sf.cmath.ellint.3], incomplete elliptic integral of the third kind double ellint_3(double k, double nu, double phi); float ellint_3f(float k, float nu, float phi); long double ellint_3l(long double k, long double nu, long double phi); // [sf.cmath.expint], exponential integral double expint(double x); float expintf(float x); long double expintl(long double x); // [sf.cmath.hermite], Hermite polynomials double hermite(unsigned n, double x); float hermitef(unsigned n, float x); long double hermitel(unsigned n, long double x); // [sf.cmath.laguerre], Laguerre polynomials double laguerre(unsigned n, double x); float laguerref(unsigned n, float x); long double laguerrel(unsigned n, long double x); // [sf.cmath.legendre], Legendre polynomials double legendre(unsigned l, double x); float legendref(unsigned l, float x); long double legendrel(unsigned l, long double x); // [sf.cmath.riemann.zeta], Riemann zeta function double riemann_zeta(double x); float riemann_zetaf(float x); long double riemann_zetal(long double x); // [sf.cmath.sph.bessel], spherical Bessel functions of the first kind double sph_bessel(unsigned n, double x); float sph_besself(unsigned n, float x); long double sph_bessell(unsigned n, long double x); // [sf.cmath.sph.legendre], spherical associated Legendre functions double sph_legendre(unsigned l, unsigned m, double theta); float sph_legendref(unsigned l, unsigned m, float theta); long double sph_legendrel(unsigned l, unsigned m, long double theta); // [sf.cmath.sph.neumann], spherical Neumann functions; // spherical Bessel functions of the second kind double sph_neumann(unsigned n, double x); float sph_neumannf(unsigned n, float x); long double sph_neumannl(unsigned n, long double x); }
The contents and meaning of the header <cmath> are the same as the C standard library header <math.h>, with the addition of a three-dimensional hypotenuse function, a linear interpolation function, and the mathematical special functions described in [sf.cmath].
[Note 1:
Several functions have additional overloads in this document, but they have the same behavior as in the C standard library.
â€” end note]
For each set of overloaded functions within <cmath>, with the exception of abs, there shall be additional overloads sufficient to ensure:
• If any argument of arithmetic type corresponding to a double parameter has type long double, then all arguments of arithmetic type corresponding to double parameters are effectively cast to long double.
• Otherwise, if any argument of arithmetic type corresponding to a double parameter has type double or an integer type, then all arguments of arithmetic type corresponding to double parameters are effectively cast to double.
• [Note 2:
Otherwise, all arguments of arithmetic type corresponding to double parameters have type float.
â€” end note]
[Note 3:
abs is exempted from these rules in order to stay compatible with C.
â€” end note]