[cmath.syn] # 29 Numerics library [[numerics]](./#numerics) ## 29.7 Mathematical functions for floating-point types [[c.math]](c.math#cmath.syn) ### 29.7.1 Header synopsis [cmath.syn] [🔗](#header:%3ccmath%3e) #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 {using float_t = *see below*; using double_t = *see below*; constexpr *floating-point-type* acos(*floating-point-type* x); constexpr float acosf(float x); constexpr long double acosl(long double x); constexpr *floating-point-type* asin(*floating-point-type* x); constexpr float asinf(float x); constexpr long double asinl(long double x); constexpr *floating-point-type* atan(*floating-point-type* x); constexpr float atanf(float x); constexpr long double atanl(long double x); constexpr *floating-point-type* atan2(*floating-point-type* y, *floating-point-type* x); constexpr float atan2f(float y, float x); constexpr long double atan2l(long double y, long double x); constexpr *floating-point-type* cos(*floating-point-type* x); constexpr float cosf(float x); constexpr long double cosl(long double x); constexpr *floating-point-type* sin(*floating-point-type* x); constexpr float sinf(float x); constexpr long double sinl(long double x); constexpr *floating-point-type* tan(*floating-point-type* x); constexpr float tanf(float x); constexpr long double tanl(long double x); constexpr *floating-point-type* acosh(*floating-point-type* x); constexpr float acoshf(float x); constexpr long double acoshl(long double x); constexpr *floating-point-type* asinh(*floating-point-type* x); constexpr float asinhf(float x); constexpr long double asinhl(long double x); constexpr *floating-point-type* atanh(*floating-point-type* x); constexpr float atanhf(float x); constexpr long double atanhl(long double x); constexpr *floating-point-type* cosh(*floating-point-type* x); constexpr float coshf(float x); constexpr long double coshl(long double x); constexpr *floating-point-type* sinh(*floating-point-type* x); constexpr float sinhf(float x); constexpr long double sinhl(long double x); constexpr *floating-point-type* tanh(*floating-point-type* x); constexpr float tanhf(float x); constexpr long double tanhl(long double x); constexpr *floating-point-type* exp(*floating-point-type* x); constexpr float expf(float x); constexpr long double expl(long double x); constexpr *floating-point-type* exp2(*floating-point-type* x); constexpr float exp2f(float x); constexpr long double exp2l(long double x); constexpr *floating-point-type* expm1(*floating-point-type* x); constexpr float expm1f(float x); constexpr long double expm1l(long double x); constexpr *floating-point-type* frexp(*floating-point-type* value, int* exp); constexpr float frexpf(float value, int* exp); constexpr long double frexpl(long double value, int* exp); constexpr int ilogb(*floating-point-type* x); constexpr int ilogbf(float x); constexpr int ilogbl(long double x); constexpr *floating-point-type* ldexp(*floating-point-type* x, int exp); constexpr float ldexpf(float x, int exp); constexpr long double ldexpl(long double x, int exp); constexpr *floating-point-type* log(*floating-point-type* x); constexpr float logf(float x); constexpr long double logl(long double x); constexpr *floating-point-type* log10(*floating-point-type* x); constexpr float log10f(float x); constexpr long double log10l(long double x); constexpr *floating-point-type* log1p(*floating-point-type* x); constexpr float log1pf(float x); constexpr long double log1pl(long double x); constexpr *floating-point-type* log2(*floating-point-type* x); constexpr float log2f(float x); constexpr long double log2l(long double x); constexpr *floating-point-type* logb(*floating-point-type* x); constexpr float logbf(float x); constexpr long double logbl(long double x); constexpr *floating-point-type* modf(*floating-point-type* value, *floating-point-type** iptr); constexpr float modff(float value, float* iptr); constexpr long double modfl(long double value, long double* iptr); constexpr *floating-point-type* scalbn(*floating-point-type* x, int n); constexpr float scalbnf(float x, int n); constexpr long double scalbnl(long double x, int n); constexpr *floating-point-type* scalbln(*floating-point-type* x, long int n); constexpr float scalblnf(float x, long int n); constexpr long double scalblnl(long double x, long int n); constexpr *floating-point-type* cbrt(*floating-point-type* x); constexpr float cbrtf(float x); constexpr long double cbrtl(long double x); // [[c.math.abs]](c.math.abs "29.7.2 Absolute values"), absolute valuesconstexpr int abs(int j); // freestandingconstexpr long int abs(long int j); // freestandingconstexpr long long int abs(long long int j); // freestandingconstexpr *floating-point-type* abs(*floating-point-type* j); // freestanding-deletedconstexpr *floating-point-type* fabs(*floating-point-type* x); constexpr float fabsf(float x); constexpr long double fabsl(long double x); constexpr *floating-point-type* hypot(*floating-point-type* x, *floating-point-type* y); constexpr float hypotf(float x, float y); constexpr long double hypotl(long double x, long double y); // [[c.math.hypot3]](c.math.hypot3 "29.7.3 Three-dimensional hypotenuse"), three-dimensional hypotenuseconstexpr *floating-point-type* hypot(*floating-point-type* x, *floating-point-type* y, *floating-point-type* z); constexpr *floating-point-type* pow(*floating-point-type* x, *floating-point-type* y); constexpr float powf(float x, float y); constexpr long double powl(long double x, long double y); constexpr *floating-point-type* sqrt(*floating-point-type* x); constexpr float sqrtf(float x); constexpr long double sqrtl(long double x); constexpr *floating-point-type* erf(*floating-point-type* x); constexpr float erff(float x); constexpr long double erfl(long double x); constexpr *floating-point-type* erfc(*floating-point-type* x); constexpr float erfcf(float x); constexpr long double erfcl(long double x); constexpr *floating-point-type* lgamma(*floating-point-type* x); constexpr float lgammaf(float x); constexpr long double lgammal(long double x); constexpr *floating-point-type* tgamma(*floating-point-type* x); constexpr float tgammaf(float x); constexpr long double tgammal(long double x); constexpr *floating-point-type* ceil(*floating-point-type* x); constexpr float ceilf(float x); constexpr long double ceill(long double x); constexpr *floating-point-type* floor(*floating-point-type* x); constexpr float floorf(float x); constexpr long double floorl(long double x); *floating-point-type* nearbyint(*floating-point-type* x); float nearbyintf(float x); long double nearbyintl(long double x); *floating-point-type* rint(*floating-point-type* x); float rintf(float x); long double rintl(long double x); long int lrint(*floating-point-type* x); long int lrintf(float x); long int lrintl(long double x); long long int llrint(*floating-point-type* x); long long int llrintf(float x); long long int llrintl(long double x); constexpr *floating-point-type* round(*floating-point-type* x); constexpr float roundf(float x); constexpr long double roundl(long double x); constexpr long int lround(*floating-point-type* x); constexpr long int lroundf(float x); constexpr long int lroundl(long double x); constexpr long long int llround(*floating-point-type* x); constexpr long long int llroundf(float x); constexpr long long int llroundl(long double x); constexpr *floating-point-type* trunc(*floating-point-type* x); constexpr float truncf(float x); constexpr long double truncl(long double x); constexpr *floating-point-type* fmod(*floating-point-type* x, *floating-point-type* y); constexpr float fmodf(float x, float y); constexpr long double fmodl(long double x, long double y); constexpr *floating-point-type* remainder(*floating-point-type* x, *floating-point-type* y); constexpr float remainderf(float x, float y); constexpr long double remainderl(long double x, long double y); constexpr *floating-point-type* remquo(*floating-point-type* x, *floating-point-type* y, int* quo); constexpr float remquof(float x, float y, int* quo); constexpr long double remquol(long double x, long double y, int* quo); constexpr *floating-point-type* copysign(*floating-point-type* x, *floating-point-type* y); 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 *floating-point-type* nextafter(*floating-point-type* x, *floating-point-type* y); constexpr float nextafterf(float x, float y); constexpr long double nextafterl(long double x, long double y); constexpr *floating-point-type* nexttoward(*floating-point-type* x, long double y); constexpr float nexttowardf(float x, long double y); constexpr long double nexttowardl(long double x, long double y); constexpr *floating-point-type* nextup(*floating-point-type* x); constexpr float nextupf(float x); constexpr long double nextupl(long double x); constexpr *floating-point-type* nextdown(*floating-point-type* x); constexpr float nextdownf(float x); constexpr long double nextdownl(long double x); constexpr *floating-point-type* fdim(*floating-point-type* x, *floating-point-type* y); constexpr float fdimf(float x, float y); constexpr long double fdiml(long double x, long double y); constexpr *floating-point-type* fmax(*floating-point-type* x, *floating-point-type* y); constexpr float fmaxf(float x, float y); constexpr long double fmaxl(long double x, long double y); constexpr *floating-point-type* fmin(*floating-point-type* x, *floating-point-type* y); constexpr float fminf(float x, float y); constexpr long double fminl(long double x, long double y); constexpr *floating-point-type* fmaximum(*floating-point-type* x, *floating-point-type* y); constexpr *floating-point-type* fmaximum_num(*floating-point-type* x, *floating-point-type* y); constexpr *floating-point-type* fminimum(*floating-point-type* x, *floating-point-type* y); constexpr *floating-point-type* fminimum_num(*floating-point-type* x, *floating-point-type* y); constexpr *floating-point-type* fma(*floating-point-type* x, *floating-point-type* y, *floating-point-type* z); 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]](c.math.lerp "29.7.4 Linear interpolation"), linear interpolationconstexpr *floating-point-type* lerp(*floating-point-type* a, *floating-point-type* b, *floating-point-type* t) noexcept; // [[c.math.fpclass]](c.math.fpclass "29.7.5 Classification / comparison functions"), classification / comparison functionsconstexpr int fpclassify(*floating-point-type* x); constexpr bool isfinite(*floating-point-type* x); constexpr bool isinf(*floating-point-type* x); constexpr bool isnan(*floating-point-type* x); constexpr bool isnormal(*floating-point-type* x); constexpr bool signbit(*floating-point-type* x); constexpr bool isgreater(*floating-point-type* x, *floating-point-type* y); constexpr bool isgreaterequal(*floating-point-type* x, *floating-point-type* y); constexpr bool isless(*floating-point-type* x, *floating-point-type* y); constexpr bool islessequal(*floating-point-type* x, *floating-point-type* y); constexpr bool islessgreater(*floating-point-type* x, *floating-point-type* y); constexpr bool isunordered(*floating-point-type* x, *floating-point-type* y); // [[sf.cmath]](sf.cmath "29.7.6 Mathematical special functions"), mathematical special functions// [[sf.cmath.assoc.laguerre]](sf.cmath.assoc.laguerre "29.7.6.2 Associated Laguerre polynomials"), associated Laguerre polynomials*floating-point-type* assoc_laguerre(unsigned n, unsigned m, *floating-point-type* 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]](sf.cmath.assoc.legendre "29.7.6.3 Associated Legendre functions"), associated Legendre functions*floating-point-type* assoc_legendre(unsigned l, unsigned m, *floating-point-type* x); float assoc_legendref(unsigned l, unsigned m, float x); long double assoc_legendrel(unsigned l, unsigned m, long double x); // [[sf.cmath.beta]](sf.cmath.beta "29.7.6.4 Beta function"), beta function*floating-point-type* beta(*floating-point-type* x, *floating-point-type* y); float betaf(float x, float y); long double betal(long double x, long double y); // [[sf.cmath.comp.ellint.1]](sf.cmath.comp.ellint.1 "29.7.6.5 Complete elliptic integral of the first kind"), complete elliptic integral of the first kind*floating-point-type* comp_ellint_1(*floating-point-type* k); float comp_ellint_1f(float k); long double comp_ellint_1l(long double k); // [[sf.cmath.comp.ellint.2]](sf.cmath.comp.ellint.2 "29.7.6.6 Complete elliptic integral of the second kind"), complete elliptic integral of the second kind*floating-point-type* comp_ellint_2(*floating-point-type* k); float comp_ellint_2f(float k); long double comp_ellint_2l(long double k); // [[sf.cmath.comp.ellint.3]](sf.cmath.comp.ellint.3 "29.7.6.7 Complete elliptic integral of the third kind"), complete elliptic integral of the third kind*floating-point-type* comp_ellint_3(*floating-point-type* k, *floating-point-type* 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]](sf.cmath.cyl.bessel.i "29.7.6.8 Regular modified cylindrical Bessel functions"), regular modified cylindrical Bessel functions*floating-point-type* cyl_bessel_i(*floating-point-type* nu, *floating-point-type* 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]](sf.cmath.cyl.bessel.j "29.7.6.9 Cylindrical Bessel functions of the first kind"), cylindrical Bessel functions of the first kind*floating-point-type* cyl_bessel_j(*floating-point-type* nu, *floating-point-type* 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]](sf.cmath.cyl.bessel.k "29.7.6.10 Irregular modified cylindrical Bessel functions"), irregular modified cylindrical Bessel functions*floating-point-type* cyl_bessel_k(*floating-point-type* nu, *floating-point-type* x); float cyl_bessel_kf(float nu, float x); long double cyl_bessel_kl(long double nu, long double x); // [[sf.cmath.cyl.neumann]](sf.cmath.cyl.neumann "29.7.6.11 Cylindrical Neumann functions"), cylindrical Neumann functions// cylindrical Bessel functions of the second kind*floating-point-type* cyl_neumann(*floating-point-type* nu, *floating-point-type* x); float cyl_neumannf(float nu, float x); long double cyl_neumannl(long double nu, long double x); // [[sf.cmath.ellint.1]](sf.cmath.ellint.1 "29.7.6.12 Incomplete elliptic integral of the first kind"), incomplete elliptic integral of the first kind*floating-point-type* ellint_1(*floating-point-type* k, *floating-point-type* phi); float ellint_1f(float k, float phi); long double ellint_1l(long double k, long double phi); // [[sf.cmath.ellint.2]](sf.cmath.ellint.2 "29.7.6.13 Incomplete elliptic integral of the second kind"), incomplete elliptic integral of the second kind*floating-point-type* ellint_2(*floating-point-type* k, *floating-point-type* phi); float ellint_2f(float k, float phi); long double ellint_2l(long double k, long double phi); // [[sf.cmath.ellint.3]](sf.cmath.ellint.3 "29.7.6.14 Incomplete elliptic integral of the third kind"), incomplete elliptic integral of the third kind*floating-point-type* ellint_3(*floating-point-type* k, *floating-point-type* nu, *floating-point-type* 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]](sf.cmath.expint "29.7.6.15 Exponential integral"), exponential integral*floating-point-type* expint(*floating-point-type* x); float expintf(float x); long double expintl(long double x); // [[sf.cmath.hermite]](sf.cmath.hermite "29.7.6.16 Hermite polynomials"), Hermite polynomials*floating-point-type* hermite(unsigned n, *floating-point-type* x); float hermitef(unsigned n, float x); long double hermitel(unsigned n, long double x); // [[sf.cmath.laguerre]](sf.cmath.laguerre "29.7.6.17 Laguerre polynomials"), Laguerre polynomials*floating-point-type* laguerre(unsigned n, *floating-point-type* x); float laguerref(unsigned n, float x); long double laguerrel(unsigned n, long double x); // [[sf.cmath.legendre]](sf.cmath.legendre "29.7.6.18 Legendre polynomials"), Legendre polynomials*floating-point-type* legendre(unsigned l, *floating-point-type* x); float legendref(unsigned l, float x); long double legendrel(unsigned l, long double x); // [[sf.cmath.riemann.zeta]](sf.cmath.riemann.zeta "29.7.6.19 Riemann zeta function"), Riemann zeta function*floating-point-type* riemann_zeta(*floating-point-type* x); float riemann_zetaf(float x); long double riemann_zetal(long double x); // [[sf.cmath.sph.bessel]](sf.cmath.sph.bessel "29.7.6.20 Spherical Bessel functions of the first kind"), spherical Bessel functions of the first kind*floating-point-type* sph_bessel(unsigned n, *floating-point-type* x); float sph_besself(unsigned n, float x); long double sph_bessell(unsigned n, long double x); // [[sf.cmath.sph.legendre]](sf.cmath.sph.legendre "29.7.6.21 Spherical associated Legendre functions"), spherical associated Legendre functions*floating-point-type* sph_legendre(unsigned l, unsigned m, *floating-point-type* 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]](sf.cmath.sph.neumann "29.7.6.22 Spherical Neumann functions"), spherical Neumann functions;// spherical Bessel functions of the second kind*floating-point-type* sph_neumann(unsigned n, *floating-point-type* x); float sph_neumannf(unsigned n, float x); long double sph_neumannl(unsigned n, long double x);} [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L9795) The contents and meaning of the header [](#header:%3ccmath%3e "29.7.1 Header synopsis [cmath.syn]") are a subset of the C standard library header [](support.c.headers.general#header:%3cmath.h%3e "17.15.1 General [support.c.headers.general]") and only the declarations shown in the synopsis above are present, with the addition of a [three-dimensional hypotenuse function](c.math.hypot3 "29.7.3 Three-dimensional hypotenuse [c.math.hypot3]"), a [linear interpolation function](c.math.lerp "29.7.4 Linear interpolation [c.math.lerp]"), and the mathematical special functions described in [[sf.cmath]](sf.cmath "29.7.6 Mathematical special functions")[.](#1.sentence-1) [*Note [1](#note-1)*: Several functions have additional overloads in this document, but they have the same behavior as in the [C standard library](library.c "16.2 The C standard library [library.c]")[.](#1.sentence-2) — *end note*] [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L9808) For each function with at least one parameter of type *floating-point-type*, the implementation provides an overload for each cv-unqualified floating-point type ([[basic.fundamental]](basic.fundamental "6.9.2 Fundamental types")) where all uses of *floating-point-type* in the function signature are replaced with that floating-point type[.](#2.sentence-1) [3](#3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L9816) For each function with at least one parameter of type *floating-point-type* other than abs, the implementation also provides additional overloads sufficient to ensure that, if every argument corresponding to a *floating-point-type* parameter has arithmetic type, then every such argument is effectively cast to the floating-point type with the greatest floating-point conversion rank and greatest floating-point conversion subrank among the types of all such arguments, where arguments of integer type are considered to have the same floating-point conversion rank as double[.](#3.sentence-1) If no such floating-point type with the greatest rank and subrank exists, then overload resolution does not result in a usable candidate ([[over.match.general]](over.match.general "12.2.1 General")) from the overloads provided by the implementation[.](#3.sentence-2) [4](#4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L9834) An invocation of nexttoward is ill-formed if the argument corresponding to the *floating-point-type* parameter has extended floating-point type[.](#4.sentence-1) See also: ISO/IEC 9899:2024, 7.12