Spec-Zone.ru › C

rint, rintf, rintl, lrint, lrintf, lrintl, llrint, llrintf, llrintl

Определено в заголовке <math.h>
float rintf( float arg );
(1) (начиная с C99)
double rint( double arg );
(2) (начиная с C99)
long double rintl( long double arg );
(3) (начиная с C99)
Определено в заголовке <tgmath.h>
#define rint( arg )
(4) (начиная с C99)
Определено в заголовке <math.h>
long lrintf( float arg );
(5) (начиная с C99)
long lrint( double arg );
(6) (начиная с C99)
long lrintl( long double arg );
(7) (начиная с C99)
Определено в заголовке <tgmath.h>
#define lrint( arg )
(8) (начиная с C99)
Определено в заголовке <math.h>
long long llrintf( float arg );
(9) (начиная с C99)
long long llrint( double arg );
(10) (начиная с C99)
long long llrintl( long double arg );
(11) (начиная с C99)
Определено в заголовке <tgmath.h>
#define llrint( arg )
(12) (начиная с C99)
1-3) Округляет аргумент с плавающей запятой arg до целого значения в формате с плавающей запятой, используя текущий режим округления.
5-7, 9-11) Округляет аргумент с плавающей запятой arg до целого значения в целочисленном формате, используя текущий режим округления.
4,8,12) Обобщённые по типу макросы: если arg имеет тип long double, вызывается rintl, lrintl, llrintl соответственно. В противном случае, если arg имеет целочисленный тип или тип double, вызывается rint, lrint, llrint соответственно. В противном случае вызывается rintf, lrintf, llrintf соответственно.

Параметры

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

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

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

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

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

Если результат lrint или llrint выходит за пределы диапазона, представимого типом возвращаемого значения, может возникнуть ошибка области определения (domain error) или ошибка диапазона (range error).

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

  • Если arg равно ±∞, оно возвращается без изменений.
  • Если arg равно ±0, оно возвращается без изменений.
  • Если arg является NaN, возвращается NaN.
Для функций lrint и llrint:
  • Если arg равно ±∞, генерируется FE_INVALID и возвращается определяемое реализацией значение.
  • Если результат округления выходит за пределы диапазона возвращаемого типа, генерируется FE_INVALID и возвращается определяемое реализацией значение.
  • Если arg является NaN, генерируется FE_INVALID и возвращается определяемое реализацией значение.

Примечания

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

Как указано в math_errhandling, исключение FE_INEXACT может генерироваться (но не обязательно на платформах с плавающей запятой, отличных от IEEE) функцией rint при округлении нецелого конечного значения.

Единственное различие между rint и nearbyint заключается в том, что nearbyint никогда не вызывает FE_INEXACT.

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

Если текущий режим округления...

  • FE_DOWNWARD, тогда rint эквивалентна floor.
  • FE_UPWARD, тогда rint эквивалентна ceil.
  • FE_TOWARDZERO, тогда rint эквивалентна trunc
  • FE_TONEAREST, тогда rint отличается от round тем, что промежуточные значения округляются до чётного, а не в сторону от нуля.

Пример

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

int main(void)
{
#pragma STDC FENV_ACCESS ON
    fesetround(FE_TONEAREST);
    printf("rounding to nearest (halfway cases to even):\n"
           "rint(+2.3) = %+.1f  ", rint(2.3));
    printf("rint(+2.5) = %+.1f  ", rint(2.5));
    printf("rint(+3.5) = %+.1f\n", rint(3.5));
    printf("rint(-2.3) = %+.1f  ", rint(-2.3));
    printf("rint(-2.5) = %+.1f  ", rint(-2.5));
    printf("rint(-3.5) = %+.1f\n", rint(-3.5));

    fesetround(FE_DOWNWARD);
    printf("rounding down: \nrint(+2.3) = %+.1f  ", rint(2.3));
    printf("rint(+2.5) = %+.1f  ", rint(2.5));
    printf("rint(+3.5) = %+.1f\n", rint(3.5));
    printf("rint(-2.3) = %+.1f  ", rint(-2.3));
    printf("rint(-2.5) = %+.1f  ", rint(-2.5));
    printf("rint(-3.5) = %+.1f\n", rint(-3.5));
    printf("rounding down with lrint: \nlrint(+2.3) = %ld  ", lrint(2.3));
    printf("lrint(+2.5) = %ld  ", lrint(2.5));
    printf("lrint(+3.5) = %ld\n", lrint(3.5));
    printf("lrint(-2.3) = %ld  ", lrint(-2.3));
    printf("lrint(-2.5) = %ld  ", lrint(-2.5));
    printf("lrint(-3.5) = %ld\n", lrint(-3.5));

    printf("lrint(-0.0) = %ld\n", lrint(-0.0));
    printf("lrint(-Inf) = %ld\n", lrint(-INFINITY)); // FE_INVALID raised

    // error handling
    feclearexcept(FE_ALL_EXCEPT);
    printf("rint(1.1) = %.1f\n", rint(1.1));
    if (fetestexcept(FE_INEXACT))
        puts("    FE_INEXACT was raised");

    feclearexcept(FE_ALL_EXCEPT);
    printf("lrint(LONG_MIN-2048.0) = %ld\n", lrint(LONG_MIN-2048.0));
    if (fetestexcept(FE_INVALID))
        puts("    FE_INVALID was raised");
}

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

rounding to nearest (halfway cases to even):
rint(+2.3) = +2.0  rint(+2.5) = +2.0  rint(+3.5) = +4.0
rint(-2.3) = -2.0  rint(-2.5) = -2.0  rint(-3.5) = -4.0
rounding down:
rint(+2.3) = +2.0  rint(+2.5) = +2.0  rint(+3.5) = +3.0
rint(-2.3) = -3.0  rint(-2.5) = -3.0  rint(-3.5) = -4.0
rounding down with lrint:
lrint(+2.3) = 2  lrint(+2.5) = 2  lrint(+3.5) = 3
lrint(-2.3) = -3  lrint(-2.5) = -3  lrint(-3.5) = -4
lrint(-0.0) = 0
lrint(-Inf) = -9223372036854775808
rint(1.1) = 1.0
    FE_INEXACT was raised
lrint(LONG_MIN-2048.0) = -9223372036854775808
    FE_INVALID was raised

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
    • 7.12.9.4 The rint functions (с: TBD)
    • 7.12.9.5 The lrint and llrint functions (с: TBD)
    • 7.25 Type-generic math <tgmath.h> (с: TBD)
    • F.10.6.4 The rint functions (с: TBD)
    • F.10.6.5 The lrint and llrint functions (с: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
    • 7.12.9.4 The rint functions (с: 184)
    • 7.12.9.5 The lrint and llrint functions (с: 184)
    • 7.25 Type-generic math <tgmath.h> (с: 272-273)
    • F.10.6.4 The rint functions (с: 384)
    • F.10.6.5 The lrint and llrint functions (с: 384)
  • Стандарт C11 (ISO/IEC 9899:2011):
    • 7.12.9.4 The rint functions (с: 252)
    • 7.12.9.5 The lrint and llrint functions (с: 252)
    • 7.25 Type-generic math <tgmath.h> (с: 373-375)
    • F.10.6.4 The rint functions (с: 527)
    • F.10.6.5 The lrint and llrint functions (с: 527)
  • Стандарт C99 (ISO/IEC 9899:1999):
    • 7.12.9.4 The rint functions (с: 232-233)
    • 7.12.9.5 The lrint and llrint functions (с: 233)
    • 7.22 Type-generic math <tgmath.h> (с: 335-337)
    • F.9.6.4 The rint functions (с: 463)
    • F.9.6.5 The lrint and llrint functions (с: 463)

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

trunctruncftruncl
(C99)(C99)(C99)
округляет до ближайшего целого числа, не превосходящего заданное значение по модулю
(функция)
nearbyintnearbyintfnearbyintl
(C99)(C99)(C99)
округляет до целого числа, используя текущий режим округления
(функция)
fegetroundfesetround
(C99)(C99)
получает или устанавливает направление округления
(функция)
Документация по C++ для rint

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/numeric/math/rint

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API