Namespaces
Variants

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

From cppreference.net
< c ‎ | numeric ‎ | math
Common mathematical functions
Functions
Basic operations
(C99)
(C99)
(C99)
(C99) (C99) (C99) (C23)
Maximum/minimum operations
Exponential functions
Power functions
Trigonometric and hyperbolic functions
Nearest integer floating-point
round lround llround
(C99) (C99) (C99)
(C99)

(C99) (C99) (C99)
(C23) (C23) (C23) (C23)
Floating-point manipulation
Narrowing operations
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
Quantum and quantum exponent
Decimal re-encoding functions
Total order and payload functions
Classification
Error and gamma functions
(C99)
(C99)
(C99)
(C99)
Types
Macro constants
Special floating-point values
Arguments and return values
Error handling
Fast operation indicators
Определено в заголовке <math.h>
float roundf ( float arg ) ;
(1) (начиная с C99)
double round ( double arg ) ;
(2) (начиная с C99)
long double roundl ( long double arg ) ;
(3) (начиная с C99)
Определено в заголовке <tgmath.h>
#define round( arg )
(4) (начиная с C99)
Определено в заголовке <math.h>
long lroundf ( float arg ) ;
(5) (начиная с C99)
long lround ( double arg ) ;
(6) (начиная с C99)
long lroundl ( long double arg ) ;
(7) (начиная с C99)
Определено в заголовке <tgmath.h>
#define lround( arg )
(8) (начиная с C99)
Определено в заголовке <math.h>
long long llroundf ( float arg ) ;
(9) (начиная с C99)
long long llround ( double arg ) ;
(10) (начиная с C99)
long long llroundl ( long double arg ) ;
(11) (начиная с C99)
Определено в заголовке <tgmath.h>
#define llround( arg )
(12) (начиная с C99)
1-3) Вычисляет ближайшее целочисленное значение к arg (в формате с плавающей запятой), округляя средние случаи от нуля, независимо от текущего режима округления.
5-7, 9-11) Вычисляет ближайшее целое значение к arg (в целочисленном формате), округляя средние случаи от нуля, независимо от текущего режима округления.
4,8,12) Макросы общего типа: Если arg имеет тип long double , roundl , lroundl , llroundl вызываются. В противном случае, если arg имеет целочисленный тип или тип double , round , lround , llround вызываются. В остальных случаях вызываются roundf , lroundf , llroundf соответственно.

Содержание

Параметры

arg - значение с плавающей запятой

Возвращаемое значение

Если ошибок не возникает, возвращается ближайшее целочисленное значение к arg , с округлением средних случаев от нуля.

Возвращаемое значение
math-round away zero.svg
Аргумент

Если возникает ошибка домена, возвращается значение, определяемое реализацией.

Обработка ошибок

Ошибки сообщаются, как указано в math_errhandling .

Если результат функции lround или llround выходит за пределы диапазона, представимого типом возвращаемого значения, может возникнуть ошибка домена или ошибка диапазона.

Если реализация поддерживает арифметику с плавающей запятой IEEE (IEC 60559):

Для функций round , roundf и roundl :
  • Текущий режим округления не оказывает влияния.
  • Если arg равен ±∞, он возвращается без изменений.
  • Если arg равен ±0, он возвращается без изменений.
  • Если arg является NaN, возвращается NaN.
Для семейств функций lround и llround :
  • FE_INEXACT никогда не возбуждается.
  • Текущий режим округления не оказывает влияния.
  • Если arg равен ±∞, FE_INVALID возбуждается и возвращается определяемое реализацией значение.
  • Если результат округления выходит за диапазон возвращаемого типа, FE_INVALID возбуждается и возвращается определяемое реализацией значение.
  • Если arg является NaN, FE_INVALID возбуждается и возвращается определяемое реализацией значение.

Примечания

FE_INEXACT может быть (но не обязательно) возбужден функцией round при округлении конечного нецелочисленного значения.

Наибольшие представимые значения с плавающей запятой являются точными целыми числами во всех стандартных форматах с плавающей запятой, поэтому round никогда не вызывает переполнения сам по себе; однако результат может переполнить любой целочисленный тип (включая intmax_t ) при сохранении в целочисленной переменной.

POSIX определяет что все случаи, когда lround или llround вызывают FE_INVALID являются ошибками домена.

Версия double для round работает так, как если бы была реализована следующим образом:

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

Пример

#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");
}

Возможный вывод:

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

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
  • 7.12.9.6 Функции round (стр.: TBD)
  • 7.12.9.7 Функции lround и llround (стр.: TBD)
  • 7.25 Обобщённая математика <tgmath.h> (стр.: TBD)
  • F.10.6.6 Функции round (стр.: TBD)
  • F.10.6.7 Функции lround и llround (стр.: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
  • 7.12.9.6 Функции round (стр: 184)
  • 7.12.9.7 Функции lround и llround (стр: 184-185)
  • 7.25 Обобщенная математика типов <tgmath.h> (стр: 272-273)
  • F.10.6.6 Функции round (стр: 384)
  • F.10.6.7 Функции lround и llround (стр: 385)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 7.12.9.6 Функции round (стр. 253)
  • 7.12.9.7 Функции lround и llround (стр. 253)
  • 7.25 Обобщенная математика <tgmath.h> (стр. 373-375)
  • F.10.6.6 Функции round (стр. 527)
  • F.10.6.7 Функции lround и llround (стр. 528)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 7.12.9.6 Функции round (стр. 233)
  • 7.12.9.7 Функции lround и llround (стр. 234)
  • 7.22 Обобщенная математика <tgmath.h> (стр. 335-337)
  • F.9.6.6 Функции round (стр. 464)
  • F.9.6.7 Функции lround и llround (стр. 464)

Смотрите также

вычисляет наибольшее целое число, не превышающее заданное значение
(функция)
(C99) (C99)
вычисляет наименьшее целое число, не меньшее заданного значения
(функция)
(C99) (C99) (C99)
округляет до ближайшего целого числа, не превышающего по модулю заданное значение
(функция)
C++ documentation для round