Files
2025-10-25 03:02:53 +03:00

72 lines
21 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[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 <cmath> 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.2Absolute 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.3Three-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.4Linear 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.5Classification / 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.6Mathematical special functions"), mathematical special functions// [[sf.cmath.assoc.laguerre]](sf.cmath.assoc.laguerre "29.7.6.2Associated 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.3Associated 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.4Beta 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.5Complete 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.6Complete 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.7Complete 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.8Regular 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.9Cylindrical 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.10Irregular 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.11Cylindrical 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.12Incomplete 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.13Incomplete 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.14Incomplete 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.15Exponential 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.16Hermite 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.17Laguerre 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.18Legendre 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.19Riemann 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.20Spherical 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.21Spherical 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.22Spherical 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 [<cmath>](#header:%3ccmath%3e "29.7.1Header <cmath> synopsis[cmath.syn]") are a subset of the C standard library header [<math.h>](support.c.headers.general#header:%3cmath.h%3e "17.15.1General[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.3Three-dimensional hypotenuse[c.math.hypot3]"),
a [linear interpolation function](c.math.lerp "29.7.4Linear interpolation[c.math.lerp]"), and
the mathematical special functions described in [[sf.cmath]](sf.cmath "29.7.6Mathematical 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.2The 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.2Fundamental 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.1General"))
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