C mathematical operations are a group of functions in the standard library of the C programming language implementing basic mathematical functions.[1][2] All functions use floating-point numbers in one manner or another. Different C standards provide different, albeit backwards-compatible, sets of functions. Most of these functions are also available in the C++ standard library, though in different headers (the C headers are included as well, but only as a deprecated compatibility feature).
Most of the mathematical functions are defined in <math.h> (<cmath> header in C++). The functions that operate on integers, such as abs, labs, div, and ldiv, are instead defined in the <stdlib.h> header (<cstdlib> header in C++).
<math.h>
<cmath>
abs
labs
div
ldiv
<stdlib.h>
<cstdlib>
Any functions that operate on angles use radians as the unit of angle.[1]
Not all of these functions are available in the C89 version of the standard. For those that are, the functions accept only type double for the floating-point arguments, leading to expensive type conversions in code that otherwise used single-precision float values. In C99, this shortcoming was fixed by introducing new sets of functions that work on float and long double arguments. Those functions are identified by f and l suffixes respectively.[3]
double
float
long double
f
l
llabs
fabs
lldiv
fmod
remainder
remquo
fma
fmax
fmin
fdim
nan
nanf
nanl
exp
exp2
expm1
log
log2
log10
log1p
ilogb
logb
sqrt
cbrt
hypot
pow
sin
cos
tan
asin
acos
atan
atan2
sinh
cosh
tanh
asinh
acosh
atanh
erf
erfc
lgamma
tgamma
ceil
floor
trunc
round
lround
llround
nearbyint
rint
lrint
llrint
frexp
ldexp
modf
scalbn
scalbln
nextafter
nexttoward
copysign
fpclassify
isfinite
isinf
isnan
isnormal
signbit
C99 adds several functions and types for fine-grained control of floating-point environment.[3] These functions can be used to control a variety of settings that affect floating-point computations, for example, the rounding mode, on what conditions exceptions occur, when numbers are flushed to zero, etc. The floating-point environment functions and types are defined in <fenv.h> header (<cfenv> in C++).
<fenv.h>
<cfenv>
feclearexcept
fegetenv
fegetexceptflag
fegetround
feholdexcept
feraiseexcept
fesetenv
fesetexceptflag
fesetround
fetestexcept
feupdateenv
C99 adds a new _Complex keyword (and complex convenience macro; only available if the <complex.h> header is included) that provides support for complex numbers. Any floating-point type can be modified with complex, and is then defined as a pair of floating-point numbers. Note that C99 and C++ do not implement complex numbers in a code-compatible way – the latter instead provides the class std::complex.
_Complex
complex
<complex.h>
std::complex
All operations on complex numbers are defined in the <complex.h> header. As with the real-valued functions, an f or l suffix denotes the float complex or long double complex variant of the function.
float complex
long double complex
cabs
carg
cimag
creal
conj
cproj
cexp
clog
csqrt
cpow
csin
ccos
ctan
casin
cacos
catan
csinh
ccosh
ctanh
casinh
cacosh
catanh
A few more complex functions are "reserved for future use in C99".[5] Implementations are provided by open-source projects that are not part of the standard library.
cerf
cerfc
The header <tgmath.h> defines a type-generic macro for each mathematical function defined in <math.h> and <complex.h>. This adds a limited support for function overloading of the mathematical functions: the same function name can be used with different types of parameters; the actual function will be selected at compile time according to the types of the parameters.
<tgmath.h>
Each type-generic macro that corresponds to a function that is defined for both real and complex numbers encapsulates a total of 6 different functions: float, double and long double, and their complex variants. The type-generic macros that correspond to a function that is defined for only real numbers encapsulates a total of 3 different functions: float, double and long double variants of the function.
The C++ language includes native support for function overloading and thus does not provide the <tgmath.h> header even as a compatibility feature.
The header <stdlib.h> (<cstdlib> in C++) defines several functions that can be used for statistically random number generation.[6]
rand
RAND_MAX
srand
arc4random
UINT32_MAX
arc4random_uniform
arc4random_buf
arc4random_stir
The arc4random family of random number functions are not defined in POSIX standard, but is found in some common libc implementations. It used to refer to the keystream generator of a leaked version of RC4 cipher (hence "alleged RC4"), but different algorithms, usually from other ciphers like ChaCha20, have been implemented since using the same name.
libc
The quality of randomness from rand are usually too weak to be even considered statistically random, and it requires explicit seeding. It is usually advised to use arc4random instead of rand when possible. Some C libraries implement rand using arc4random_uniform internally.
Under POSIX systems like Linux and BSD, the mathematical functions (as declared in <math.h>) are bundled separately in the mathematical library libm. Therefore, if any of those functions are used, the linker must be given the directive -lm. There are various libm implementations, including:
libm
-lm
libms
Implementations not necessarily under a name of libm include:
constexpr
math.h