round, roundf, roundl, lround, lroundf, lroundl, llround, llroundf, llroundl (original) (raw)

Defined in header <math.h>
float roundf( float arg ); (1) (since C99)
double round( double arg ); (2) (since C99)
long double roundl( long double arg ); (3) (since C99)
Defined in header <tgmath.h>
#define round( arg ) (4) (since C99)
Defined in header <math.h>
long lroundf( float arg ); (5) (since C99)
long lround( double arg ); (6) (since C99)
long lroundl( long double arg ); (7) (since C99)
Defined in header <tgmath.h>
#define lround( arg ) (8) (since C99)
Defined in header <math.h>
long long llroundf( float arg ); (9) (since C99)
long long llround( double arg ); (10) (since C99)
long long llroundl( long double arg ); (11) (since C99)
Defined in header <tgmath.h>
#define llround( arg ) (12) (since C99)

1-3) Computes the nearest integer value to arg (in floating-point format), rounding halfway cases away from zero, regardless of the current rounding mode.

5-7, 9-11) Computes the nearest integer value to arg (in integer format), rounding halfway cases away from zero, regardless of the current rounding mode.

4,8,12) Type-generic macros: If arg has type long double, roundl, lroundl, llroundl is called. Otherwise, if arg has integer type or the type double, round, lround, llround is called. Otherwise, roundf, lroundf, llroundf is called, respectively.

Contents

[edit] Parameters

arg - floating-point value

[edit] Return value

If no errors occur, the nearest integer value to arg, rounding halfway cases away from zero, is returned.

Return value

math-round away zero.svg

Argument

If a domain error occurs, an implementation-defined value is returned.

[edit] Error handling

Errors are reported as specified in math_errhandling.

If the result of lround or llround is outside the range representable by the return type, a domain error or a range error may occur.

If the implementation supports IEEE floating-point arithmetic (IEC 60559):

For the round, roundf, and roundl function:

For lround and llround families of functions:

[edit] Notes

FE_INEXACT may be (but isn't required to be) raised by round when rounding a non-integer finite value.

The largest representable floating-point values are exact integers in all standard floating-point formats, so round never overflows on its own; however the result may overflow any integer type (including intmax_t), when stored in an integer variable.

POSIX specifies that all cases where lround or llround raise FE_INVALID are domain errors.

The double version of round behaves as if implemented as follows:

#include <math.h> #pragma STDC FENV_ACCESS ON   double round(double x) { return signbit(x) ? ceil(x - 0.5) : floor(x + 0.5); }

[edit] Example

#include <assert.h> #include <fenv.h> #include <float.h> #include <limits.h> #include <math.h> #include <stdio.h> // #pragma STDC FENV_ACCESS ON   double custom_round(double x) { return signbit(x) ? ceil(x - 0.5) : floor(x + 0.5); }   void test_custom_round() { const double sample[] = { 0.0, 2.3, 2.5 - DBL_EPSILON, 2.5, 2.5 + DBL_EPSILON, 2.7, INFINITY }; for (size_t t = 0; t < sizeof sample / sizeof(double); ++t) assert(round(+sample[t]) == custom_round(+sample[t]) && round(-sample[t]) == custom_round(-sample[t])); }   int main(void) { // round printf("round(+2.3) = %+.1f ", round(2.3)); printf("round(+2.5) = %+.1f ", round(2.5)); printf("round(+2.7) = %+.1f\n", round(2.7)); printf("round(-2.3) = %+.1f ", round(-2.3)); printf("round(-2.5) = %+.1f ", round(-2.5)); printf("round(-2.7) = %+.1f\n", round(-2.7));   printf("round(-0.0) = %+.1f\n", round(-0.0)); printf("round(-Inf) = %+f\n", round(-INFINITY));   test_custom_round();   // lround printf("lround(+2.3) = %+ld ", lround(2.3)); printf("lround(+2.5) = %+ld ", lround(2.5)); printf("lround(+2.7) = %+ld\n", lround(2.7)); printf("lround(-2.3) = %+ld ", lround(-2.3)); printf("lround(-2.5) = %+ld ", lround(-2.5)); printf("lround(-2.7) = %+ld\n", lround(-2.7));   printf("lround(-0.0) = %+ld\n", lround(-0.0)); printf("lround(-Inf) = %+ld\n", lround(-INFINITY)); // FE_INVALID raised   // error handling feclearexcept(FE_ALL_EXCEPT); printf("lround(LONG_MAX+1.5) = %ld\n", lround(LONG_MAX + 1.5)); if (fetestexcept(FE_INVALID)) puts(" FE_INVALID was raised"); }

Possible output:

round(+2.3) = +2.0 round(+2.5) = +3.0 round(+2.7) = +3.0 round(-2.3) = -2.0 round(-2.5) = -3.0 round(-2.7) = -3.0 round(-0.0) = -0.0 round(-Inf) = -inf lround(+2.3) = +2 lround(+2.5) = +3 lround(+2.7) = +3 lround(-2.3) = -2 lround(-2.5) = -3 lround(-2.7) = -3 lround(-0.0) = +0 lround(-Inf) = -9223372036854775808 lround(LONG_MAX+1.5) = -9223372036854775808 FE_INVALID was raised

[edit] References

[edit] See also