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 выходит за пределы диапазона, представимого типом возвращаемого значения, может произойти ошибка домена или ошибка диапазона.

Если реализация поддерживает арифметику с плавающей точкой 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 <stdio.h>
#include <math.h>
#include <fenv.h>
#include <limits.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

Ссылки

  • Стандарт C17 (ISO/IEC 9899:2018):
    • 7.12.9.4 Функции rint (стр: 184)
    • 7.12.9.5 Функции lrint и llrint (стр: 184)
    • 7.25 Универсальная математика типов <tgmath.h> (стр: 272-273)
    • F.10.6.4 Функции rint (стр: 384)
    • F.10.6.5 Функции lrint и llrint (стр: 384)
  • Стандарт C11 (ISO/IEC 9899:2011):
    • 7.12.9.4 Функции rint (стр: 252)
    • 7.12.9.5 Функции lrint и llrint (стр: 252)
    • 7.25 Универсальная математика типов <tgmath.h> (стр: 373-375)
    • F.10.6.4 Функции rint (стр: 527)
    • F.10.6.5 Функции lrint и llrint (стр: 527)
  • Стандарт C99 (ISO/IEC 9899:1999):
    • 7.12.9.4 Функции rint (стр: 232-233)
    • 7.12.9.5 Функции lrint и llrint (стр: 233)
    • 7.22 Универсальная математика типов <tgmath.h> (стр: 335-337)
    • F.9.6.4 Функции rint (стр: 463)
    • F.9.6.5 Функции lrint и llrint (стр: 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/w/c/numeric/math/rint

Spec-Zone.ru

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