Namespaces
Variants

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

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
rint lrint llrint
(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 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 ) при сохранении в целочисленной переменной.

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

Пример

#include <fenv.h>
#include <limits.h>
#include <math.h>
#include <stdio.h>
int main(void)
{
#pragma STDC FENV_ACCESS ON
    fesetround(FE_TONEAREST);
    printf("округление к ближайшему (пограничные случаи к четному):\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("округление вниз: \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("округление вниз с 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
    // обработка ошибок
    feclearexcept(FE_ALL_EXCEPT);
    printf("rint(1.1) = %.1f\n", rint(1.1));
    if (fetestexcept(FE_INEXACT))
        puts("    FE_INEXACT был поднят");
    feclearexcept(FE_ALL_EXCEPT);
    printf("lrint(LONG_MIN-2048.0) = %ld\n", lrint(LONG_MIN-2048.0));
    if (fetestexcept(FE_INVALID))
        puts("    FE_INVALID был поднят");
}

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

округление к ближайшему (пограничные случаи к четному):
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
округление вниз:
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
округление вниз с 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 был поднят
lrint(LONG_MIN-2048.0) = -9223372036854775808
    FE_INVALID был поднят

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
  • 7.12.9.4 Функции rint (стр.: TBD)
  • 7.12.9.5 Функции lrint и llrint (стр.: TBD)
  • 7.25 Обобщенная математика типов <tgmath.h> (стр.: TBD)
  • F.10.6.4 Функции rint (стр.: TBD)
  • F.10.6.5 Функции lrint и llrint (стр.: TBD)
  • Стандарт 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)
округляет до ближайшего целого числа, не превышающего по модулю заданное значение
(функция)
округляет до целого числа, используя текущий режим округления
(функция)
получает или устанавливает направление округления
(функция)