Skip to content
Surf Wiki
Save to docs
general/c-standard-library

From Surf Wiki (app.surf) — the open knowledge base

C mathematical functions

C standard library header file


Summary

C standard library header file

C mathematical operations are a group of functions in the standard library of the C programming language implementing basic mathematical functions. 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).

Overview of functions

Most of the mathematical functions, which use floating-point numbers, are defined in ( header in C++). The functions that operate on integers, such as abs, labs, div, and ldiv, are instead defined in the header ( header in C++).

Any functions that operate on angles use radians as the unit of angle.

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.

FunctionDescriptionExponential
functionsPower
functionsTrigonometric
functionsHyperbolic
functionsError and
gamma
functionsNearest
integer
floating-
point
operationsFloating-
point
manipulation
functionsClassification
abs`abs`
labs`labs`
llabs`llabs`computes absolute value of an integer value
fabs`fabs`computes absolute value of a floating-point value
div`div`
ldiv`ldiv`
lldiv`lldiv`computes the quotient and remainder of integer division
fmod`fmod`remainder of the floating-point division operation
remainder`remainder`signed remainder of the division operation
remquo`remquo`signed remainder as well as the three last bits of the division operation
fma`fma`fused multiply-add operation
fmax`fmax`larger of two floating-point values
fmin`fmin`smaller of two floating-point values
fdim`fdim`positive difference of two floating-point values
nan`nan`
nanf`nanf`
nanl`nanl`returns a NaN (not-a-number)
exp`exp`returns e raised to the given power
exp2`exp2`returns 2 raised to the given power
expm1`expm1`returns e raised to the given power, minus one
log`log`computes natural logarithm (to base e)
log2`log2`computes binary logarithm (to base 2)
log10`log10`computes common logarithm (to base 10)
log1p`log1p`computes natural logarithm (to base e) of 1 plus the given number
ilogb`ilogb`extracts exponent of the number
logb`logb`extracts exponent of the number
sqrt`sqrt`computes square root
cbrt`cbrt`computes cubic root
hypot`hypot`computes square root of the sum of the squares of two given numbers
pow`pow`raises a number to the given power
sin`sin`computes sine
cos`cos`computes cosine
tan`tan`computes tangent
asin`asin`computes arc sine
acos`acos`computes arc cosine
atan`atan`computes arc tangent
atan2`atan2`computes arc tangent, using signs to determine quadrants
sinh`sinh`computes hyperbolic sine
cosh`cosh`computes hyperbolic cosine
tanh`tanh`computes hyperbolic tangent
asinh`asinh`computes hyperbolic arc sine
acosh`acosh`computes hyperbolic arc cosine
atanh`atanh`computes hyperbolic arc tangent
erf`erf`computes error function
erfc`erfc`computes complementary error function
lgamma`lgamma`computes natural logarithm of the absolute value of the gamma function
tgamma`tgamma`computes gamma function
ceil`ceil`returns the nearest integer not less than the given value
floor`floor`returns the nearest integer not greater than the given value
trunc`trunc`returns the nearest integer not greater in magnitude than the given value
round`round`
lround`lround`
llround`llround`returns the nearest integer, rounding away from zero in halfway cases
nearbyint`nearbyint`returns the nearest integer using current rounding mode
rint`rint`
lrint`lrint`
llrint`llrint`returns the nearest integer using current rounding mode with exception if the result differs
frexp`frexp`decomposes a number into significand and a power of 2
ldexp`ldexp`multiplies a number by 2 raised to a power
modf`modf`decomposes a number into integer and fractional parts
scalbn`scalbn`
scalbln`scalbln`multiplies a number by FLT_RADIX raised to a power
nextafter`nextafter`
nexttoward`nexttoward`returns next representable floating-point value towards the given value
copysign`copysign`copies the sign of a floating-point value
fpclassify`fpclassify`categorizes the given floating-point value
isfinite`isfinite`checks if the argument has finite value
isinf`isinf`checks if the argument is infinite
isnan`isnan`checks if the argument is NaN
isnormal`isnormal`checks if the argument is normal
signbit`signbit`checks if the sign of the argument is negative

{{anchor|fenv.h}}Floating-point environment

C99 adds several functions and types for fine-grained control of floating-point environment. 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 header ( in C++).

FunctionDescription
feclearexcept`feclearexcept`clears exceptions (C99)
fegetenv`fegetenv`stores current floating-point environment (C99)
fegetexceptflag`fegetexceptflag`stores current status flags (C99)
fegetround`fegetround`retrieves current rounding direction (C99)
feholdexcept`feholdexcept`saves current floating-point environment and clears all exceptions (C99)
feraiseexcept`feraiseexcept`raises a floating-point exception (C99)
fesetenv`fesetenv`sets current floating-point environment (C99)
fesetexceptflag`fesetexceptflag`sets current status flags (C99)
fesetround`fesetround`sets current rounding direction (C99)
fetestexcept`fetestexcept`tests whether certain exceptions have been raised (C99)
feupdateenv`feupdateenv`restores floating-point environment, but keeps current exceptions (C99)

{{anchor|complex.h}} Complex numbers

C99 adds a new _Complex keyword (and complex convenience macro; only available if the `` 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 .

All operations on complex numbers are defined in the `` header. As with the real-valued functions, an f or l suffix denotes the float complex or long double complex variant of the function.

FunctionDescriptionBasic
operationsExponentiation
operationsTrigonometric
operationsHyperbolic
operations
cabs`cabs`computes absolute value (C99)
carg`carg`computes argument of a complex number (C99)
cimag`cimag`computes imaginary part of a complex number (C99)
creal`creal`computes real part of a complex number (C99)
conj`conj`computes complex conjugate (C99)
cproj`cproj`computes complex projection into the Riemann sphere (C99)
cexp`cexp`computes complex exponential (C99)
clog`clog`computes complex logarithm (C99)
csqrt`csqrt`computes complex square root (C99)
cpow`cpow`computes complex power (C99)
csin`csin`computes complex sine (C99)
ccos`ccos`computes complex cosine (C99)
ctan`ctan`computes complex tangent (C99)
casin`casin`computes complex arc sine (C99)
cacos`cacos`computes complex arc cosine (C99)
catan`catan`computes complex arc tangent (C99)
csinh`csinh`computes complex hyperbolic sine (C99)
ccosh`ccosh`computes complex hyperbolic cosine (C99)
ctanh`ctanh`computes complex hyperbolic tangent (C99)
casinh`casinh`computes complex hyperbolic arc sine (C99)
cacosh`cacosh`computes complex hyperbolic arc cosine (C99)
catanh`catanh`computes complex hyperbolic arc tangent (C99)

A few more complex functions are "reserved for future use in C99". Implementations are provided by open-source projects that are not part of the standard library.

FunctionDescriptionError functions
cerf`cerf`computes the complex error function (C99)
cerfc`cerfc`computes the complex complementary error function (C99)

Type-generic functions

tgmath.h The header defines a type-generic macro for each mathematical function defined in and ``. 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.

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 `` header even as a compatibility feature.

Random-number generation

stdlib.h The header ( in C++) defines several functions that can be used for statistically random number generation.

FunctionDescription
rand`rand`generates a pseudo-random number between 0 and `RAND_MAX`, inclusive.
srand`srand`initializes a pseudo-random number generator
arc4random`arc4random`generates a pseudo-random number between 0 and `UINT32_MAX`, usually using a better algorithm than `rand`
arc4random`arc4random_uniform`generates a pseudo-random number between 0 and a maximum value.
arc4random`arc4random_buf`fill a buffer with a pseudo-random bitstream.
arc4random`arc4random_stir`initializes a pseudo-random number generator.

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.

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.

Implementations

Under POSIX systems like Linux and BSD, the mathematical functions (as declared in ) are bundled separately in the mathematical library . Therefore, if any of those functions are used, the linker must be given the directive -lm. There are various libm implementations, including:

  • GNU libc's libm
  • AMD's libm, github, used almost as is by Windows
  • Intel C++ Compiler libm
  • Red Hat's libm (Newlib)
  • Sun's FDLIBM, which was used as the basis for FreeBSD's msun and OpenBSD's libm, both of which in turn were the basis of Julia's OpenLibm
  • musl's libm, based on the BSD libms and other projects like Arm
  • LLVM's libm, which is correctly rounded (i.e. errors from the mathematically correct result are lower than 0.5 unit in the last place)
  • Arénaire project's CRlibm (correctly rounded libm), and its successor MetaLibm, which uses Remez algorithm to automatically generate approximations that are formally proven.
  • Rutger's RLIBM, which provides correctly rounded functions in single precision.

Implementations not necessarily under a name of include:

  • Arm's
  • is a version of C/C++ math functions written for C++ (compile-time calculation)
  • CORE-MATH, correctly rounded for single and double precision.
  • SIMD (vectorized) math libraries include SLEEF, Yeppp! , and Agner Fog's VCL, plus a few closed-source ones like SVML and DirectXMath.

References

References

  1. "ISO/IEC 9899:1999 specification".
  2. Prata, Stephen. (2004). "C primer plus". Sams Publishing.
  3. Prata, Stephen. (2004). "C primer plus". Sams Publishing.
  4. Notationally, it may seem convenient to use pow(''x'',2) or pow(''x'',3) to compute squares or cubes. However, this is not advisable in time-critical code. Unless an implementation takes special care of these cases at compile time, ''x''''x'' or ''x''''x''*''x'' will execute much faster. Also, sqrt(''x'') and cbrt(''x'') should be preferred over pow(''x'',.5) or pow(''x'',1./3).
  5. man cerf(3), man cerfc(3), see e.g. https://linux.die.net/man/3/cerf.
  6. "The GNU C Library – ISO Random".
  7. "Math Functions — The LLVM C Library".
  8. "RLibm: Rutgers Architecture and Programming Languages Lab's Correctly Rounded Libm".
  9. "intel - Where is Clang's '_mm256_pow_ps' intrinsic?".
Wikipedia Source

This article was imported from Wikipedia and is available under the Creative Commons Attribution-ShareAlike 4.0 License. Content has been adapted to SurfDoc format. Original contributors can be found on the article history page.

Want to explore this topic further?

Ask Mako anything about C mathematical functions — get instant answers, deeper analysis, and related topics.

Research with Mako

Free with your Surf account

Content sourced from Wikipedia, available under CC BY-SA 4.0.

This content may have been generated or modified by AI. CloudSurf Software LLC is not responsible for the accuracy, completeness, or reliability of AI-generated content. Always verify important information from primary sources.

Report