round, roundf, roundl, lround, lroundf, lroundl, llround, llroundf, llroundl - cppreference.com

##### cppreference.com

##### Search

Create account

##### Namespaces

- Page
- Discussion

##### Variants

##### Views

- View
- Edit
- History

##### Actions

# round, roundf, roundl, lround, lroundf, lroundl, llround, llroundf, llroundl

From cppreference.com
< c‎ | numeric‎ | math

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.

### [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
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:

- The current rounding mode has no effect.
- If `arg` is ±∞, it is returned, unmodified
- If `arg` is ±0, it is returned, unmodified
- If `arg` is NaN, NaN is returned

  For `lround` and `llround` families of functions:

- FE_INEXACT is never raised
- The current rounding mode has no effect.
- If `arg` is ±∞, FE_INVALID is raised and an implementation-defined value is returned
- If the result of the rounding is outside the range of the return type, FE_INVALID is raised and an implementation-defined value is returned
- If `arg` is NaN, FE_INVALID is raised and an implementation-defined value is returned

### [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_INEXACT are domain errors.

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

    #include <math.h>
    #include <fenv.h>
    #pragma STDC FENV_ACCESS ON
    double round(double x)
    {
        fenv_t save_env;
        feholdexcept(&save_env);
        double result = rint(x);
        if (fetestexcept(FE_INEXACT)) {
            fesetround(FE_TOWARDZERO);
            result = rint(copysign(0.5 + fabs(x), x));
        }
        feupdateenv(&save_env);
        return result;
    }

### [edit] Example

Run this code

    #include <stdio.h>
    #include <math.h>
    #include <fenv.h>
    #include <limits.h>

    #pragma STDC FENV_ACCESS ON

    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));

        // 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] See also

floorfloorffloorl (C99)(C99) | computes largest integer not greater than the given value (function) [edit]
ceilceilfceill (C99)(C99) | computes smallest integer not less than the given value (function) [edit]
trunctruncftruncl (C99)(C99)(C99) | rounds to nearest integer not greater in magnitude than the given value (function) [edit]
C++ documentation for round

Retrieved from "http://en.cppreference.com/mwiki/index.php?title=c/numeric/math/round&oldid=72027"