## 19 Mathematics ¶

This chapter contains information about functions for performing mathematical computations, such as trigonometric functions. Most of these functions have prototypes declared in the header file `math.h`. The complex-valued functions are defined in `complex.h`.

All mathematical functions which take a floating-point argument have three variants, one each for `double`, `float`, and `long double` arguments. The `double` versions are mostly defined in ISO C89. The `float` and `long double` versions are from the numeric extensions to C included in ISO C99.

Which of the three versions of a function should be used depends on the situation. For most calculations, the `float` functions are the fastest. On the other hand, the `long double` functions have the most precision and exponent range. `double` is somewhere in between. It is usually wise to pick the smallest type that can accommodate your data. On some machines `long double` has no more precision or exponent range than `double`, though the types remain distinct for type checking.

The GNU C Library also provides `_FloatN` and `_FloatNx` types. These types are defined in ISO/IEC TS 18661-3, which extends ISO C and defines floating-point types that are not machine-dependent. When such a type, such as `_Float128`, is supported by the GNU C Library, extra variants for most of the mathematical functions provided for `double`, `float`, and `long double` are also provided for the supported type. Throughout this manual, the `_FloatN` and `_FloatNx` variants of these functions are described along with the `double`, `float`, and `long double` variants and they come from ISO/IEC TS 18661-3, unless explicitly stated otherwise.

Support for `_FloatN` or `_FloatNx` types is provided for `_Float32`, `_Float64` and `_Float32x` on all platforms. It is also provided for `_Float128` and `_Float64x` on powerpc64le (PowerPC 64-bits little-endian), x86_64, x86, aarch64, alpha, loongarch, mips64, riscv, s390 and sparc.