20.8.3 Rounding Functions

The functions listed here perform operations such as rounding and truncation of floating-point values. Some of these functions convert floating point numbers to integer values. They are all declared in math.h.

You can also convert floating-point numbers to integers simply by casting them to int. This discards the fractional part, effectively rounding towards zero. However, this only works if the result can actually be represented as an int—for very large numbers, this is impossible. The functions listed here return the result as a double instead to get around this problem.

The fromfp functions use the following macros, from TS 18661-1:2014, to specify the direction of rounding. These correspond to the rounding directions defined in IEEE 754-2008.

FP_INT_UPWARD

Round toward +∞.

FP_INT_DOWNWARD

Round toward -∞.

FP_INT_TOWARDZERO

Round toward zero.

FP_INT_TONEARESTFROMZERO

Round to nearest, ties round away from zero.

FP_INT_TONEAREST

Round to nearest, ties round to even.

Function: double ceil (double x)
Function: float ceilf (float x)
Function: long double ceill (long double x)
Function: _FloatN ceilfN (_FloatN x)
Function: _FloatNx ceilfNx (_FloatNx x)

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

These functions round x upwards to the nearest integer, returning that value as a double. Thus, ceil (1.5) is 2.0.

Function: double floor (double x)
Function: float floorf (float x)
Function: long double floorl (long double x)
Function: _FloatN floorfN (_FloatN x)
Function: _FloatNx floorfNx (_FloatNx x)

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

These functions round x downwards to the nearest integer, returning that value as a double. Thus, floor (1.5) is 1.0 and floor (-1.5) is -2.0.

Function: double trunc (double x)
Function: float truncf (float x)
Function: long double truncl (long double x)
Function: _FloatN truncfN (_FloatN x)
Function: _FloatNx truncfNx (_FloatNx x)

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

The trunc functions round x towards zero to the nearest integer (returned in floating-point format). Thus, trunc (1.5) is 1.0 and trunc (-1.5) is -1.0.

Function: double rint (double x)
Function: float rintf (float x)
Function: long double rintl (long double x)
Function: _FloatN rintfN (_FloatN x)
Function: _FloatNx rintfNx (_FloatNx x)

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

These functions round x to an integer value according to the current rounding mode. See Floating Point Parameters, for information about the various rounding modes. The default rounding mode is to round to the nearest integer; some machines support other modes, but round-to-nearest is always used unless you explicitly select another.

If x was not initially an integer, these functions raise the inexact exception.

Function: double nearbyint (double x)
Function: float nearbyintf (float x)
Function: long double nearbyintl (long double x)
Function: _FloatN nearbyintfN (_FloatN x)
Function: _FloatNx nearbyintfNx (_FloatNx x)

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

These functions return the same value as the rint functions, but do not raise the inexact exception if x is not an integer.

Function: double round (double x)
Function: float roundf (float x)
Function: long double roundl (long double x)
Function: _FloatN roundfN (_FloatN x)
Function: _FloatNx roundfNx (_FloatNx x)

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

These functions are similar to rint, but they round halfway cases away from zero instead of to the nearest integer (or other current rounding mode).

Function: double roundeven (double x)
Function: float roundevenf (float x)
Function: long double roundevenl (long double x)
Function: _FloatN roundevenfN (_FloatN x)
Function: _FloatNx roundevenfNx (_FloatNx x)

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

These functions, from TS 18661-1:2014 and TS 18661-3:2015, are similar to round, but they round halfway cases to even instead of away from zero.

Function: long int lrint (double x)
Function: long int lrintf (float x)
Function: long int lrintl (long double x)
Function: long int lrintfN (_FloatN x)
Function: long int lrintfNx (_FloatNx x)

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

These functions are just like rint, but they return a long int instead of a floating-point number.

Function: long long int llrint (double x)
Function: long long int llrintf (float x)
Function: long long int llrintl (long double x)
Function: long long int llrintfN (_FloatN x)
Function: long long int llrintfNx (_FloatNx x)

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

These functions are just like rint, but they return a long long int instead of a floating-point number.

Function: long int lround (double x)
Function: long int lroundf (float x)
Function: long int lroundl (long double x)
Function: long int lroundfN (_FloatN x)
Function: long int lroundfNx (_FloatNx x)

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

These functions are just like round, but they return a long int instead of a floating-point number.

Function: long long int llround (double x)
Function: long long int llroundf (float x)
Function: long long int llroundl (long double x)
Function: long long int llroundfN (_FloatN x)
Function: long long int llroundfNx (_FloatNx x)

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

These functions are just like round, but they return a long long int instead of a floating-point number.

Function: double fromfp (double x, int round, unsigned int width)
Function: float fromfpf (float x, int round, unsigned int width)
Function: long double fromfpl (long double x, int round, unsigned int width)
Function: _FloatN fromfpfN (_FloatN x, int round, unsigned int width)
Function: _FloatNx fromfpfNx (_FloatNx x, int round, unsigned int width)
Function: double ufromfp (double x, int round, unsigned int width)
Function: float ufromfpf (float x, int round, unsigned int width)
Function: long double ufromfpl (long double x, int round, unsigned int width)
Function: _FloatN ufromfpfN (_FloatN x, int round, unsigned int width)
Function: _FloatNx ufromfpfNx (_FloatNx x, int round, unsigned int width)
Function: double fromfpx (double x, int round, unsigned int width)
Function: float fromfpxf (float x, int round, unsigned int width)
Function: long double fromfpxl (long double x, int round, unsigned int width)
Function: _FloatN fromfpxfN (_FloatN x, int round, unsigned int width)
Function: _FloatNx fromfpxfNx (_FloatNx x, int round, unsigned int width)
Function: double ufromfpx (double x, int round, unsigned int width)
Function: float ufromfpxf (float x, int round, unsigned int width)
Function: long double ufromfpxl (long double x, int round, unsigned int width)
Function: _FloatN ufromfpxfN (_FloatN x, int round, unsigned int width)
Function: _FloatNx ufromfpxfNx (_FloatNx x, int round, unsigned int width)

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

These functions, from TS 18661-1:2014 and TS 18661-3:2015, convert a floating-point number to an integer according to the rounding direction round (one of the FP_INT_* macros). If the integer is outside the range of a two’s complement signed or unsigned (depending on the return type of the function) integer of width width bits, or if x is infinite or NaN, or if width is zero, a domain error occurs and a NaN is returned. The functions with an ‘x’ in their names raise the inexact exception when a domain error does not occur and the argument is not an integer; the other functions do not raise the inexact exception.

Following ISO C23, in the GNU C Library these functions return their result in the floating-point argument type. In TS 18661-1:2014 and TS 18661-3:2015, they were originally defined to return intmax_t and uintmax_t.

Function: double modf (double value, double *integer-part)
Function: float modff (float value, float *integer-part)
Function: long double modfl (long double value, long double *integer-part)
Function: _FloatN modffN (_FloatN value, _FloatN *integer-part)
Function: _FloatNx modffNx (_FloatNx value, _FloatNx *integer-part)

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

These functions break the argument value into an integer part and a fractional part (between -1 and 1, exclusive). Their sum equals value. Each of the parts has the same sign as value, and the integer part is always rounded toward zero.

modf stores the integer part in *integer-part, and returns the fractional part. For example, modf (2.5, &intpart) returns 0.5 and stores 2.0 into intpart.