Jump to content

C mathematical functions

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by 209.169.114.164 (talk) at 15:45, 13 June 2023 (help). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

Oops accidentally pressed ctrl z please help

| returns e raised to the given power |- | exp2 | returns 2 raised to the given power |- | expm1 | returns e raised to the given power, minus one |- | log | computes natural logarithm (to base e) |- | log2 | computes binary logarithm (to base 2) |- | log10 | computes common logarithm (to base 10) |- | log1p | computes natural logarithm (to base e) of 1 plus the given number |- | ilogb | extracts exponent of the number |- | logb | extracts exponent of the number |- ! rowspan=4 | Power
functions | sqrt | computes square root |- | cbrt | computes cubic root |- | hypot | computes square root of the sum of the squares of two given numbers |- | pow | raises a number to the given power[1] |- ! rowspan=7 | Trigonometric
functions | sin | computes sine |- | cos | computes cosine |- | tan | computes tangent |- | asin | computes arc sine |- | acos | computes arc cosine |- | atan | computes arc tangent |- | atan2 | computes arc tangent, using signs to determine quadrants |- ! rowspan=6 | Hyperbolic
functions | sinh | computes hyperbolic sine |- | cosh | computes hyperbolic cosine |- | tanh | computes hyperbolic tangent |- | asinh | computes hyperbolic arc sine |- | acosh | computes hyperbolic arc cosine |- | atanh | computes hyperbolic arc tangent |- ! rowspan=4 | Error and
gamma
functions | erf | computes error function |- | erfc | computes complementary error function |- | lgamma | computes natural logarithm of the absolute value of the gamma function |- | tgamma | computes gamma function |- ! rowspan=6 | Nearest
integer
floating-
point
operations | ceil | returns the nearest integer not less than the given value |- | floor | returns the nearest integer not greater than the given value |- | trunc | returns the nearest integer not greater in magnitude than the given value |- | round
lround
llround | returns the nearest integer, rounding away from zero in halfway cases |- | nearbyint | returns the nearest integer using current rounding mode |- | rint
lrint
llrint | returns the nearest integer using current rounding mode with exception if the result differs |- ! rowspan=6 | Floating-
point
manipulation
functions | frexp | decomposes a number into significand and a power of 2 |- | ldexp | multiplies a number by 2 raised to a power |- | modf | decomposes a number into integer and fractional parts |- | scalbn
scalbln | multiplies a number by FLT_RADIX raised to a power |- | nextafter
nexttoward | returns next representable floating-point value towards the given value |- | copysign | copies the sign of a floating-point value |- ! rowspan=6 | Classification | fpclassify | categorizes the given floating-point value |- | isfinite | checks if the argument has finite value |- | isinf | checks if the argument is infinite |- | isnan | checks if the argument is NaN |- | isnormal | checks if the argument is normal |- | signbit | checks if the sign of the argument is negative |}

Floating-point environment

C99 adds several functions and types for fine-grained control of floating-point environment.[2] 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++).

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

Complex numbers

C99 adds a new _Complex keyword (and complex convenience macro) 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.

All operations on complex numbers are defined in <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.

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

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

Function Description
Error functions cerf computes the complex error function (C99)
cerfc computes the complex complementary error function (C99)

Type-generic functions

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.

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.

Random number generation

The header <stdlib.h> (<cstdlib> in C++) defines several functions that can be used for statistically random number generation.[4]

Function Description
rand generates a pseudo-random number between 0 and RAND_MAX, inclusive.
srand initializes a pseudo-random number generator
arc4random generates a pseudo-random number between 0 and UINT32_MAX, usually using a better algorithm than rand
arc4random_uniform generates a pseudo-random number between 0 and a maximum value.
arc4random_buf fill a buffer with a pseudo-random bitstream.
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 <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:

Implementations not necessarily under a name of libm include:

See also

References

  1. ^ 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).
  2. ^ Cite error: The named reference c_primer_c99 was invoked but never defined (see the help page).
  3. ^ man cerf(3), man cerfc(3), see e.g. https://linux.die.net/man/3/cerf.
  4. ^ "The GNU C Library – ISO Random". Retrieved 18 July 2018.
  5. ^ Cordes, Peter. "intel - Where is Clang's '_mm256_pow_ps' intrinsic?". Stack Overflow.