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) |
arg до целого значения в формате с плавающей точкой, используя текущий режим округления.arg до целого значения в целочисленном формате, используя текущий режим округления.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)
См. также
|
(C99)(C99)(C99) |
округляет до ближайшего целого, не большего по абсолютной величине, чем данное значение (функция) |
|
(C99)(C99)(C99) |
округляет до целого, используя текущий режим округления (функция) |
|
(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