Namespaces
Variants

std:: rint, std:: rintf, std:: rintl, std:: lrint, std:: lrintf, std:: lrintl, std:: llrint, std:: llrintf

From ru.cppreference.net
Common mathematical functions
Nearest integer floating point operations
(C++11)
(C++11)
rint lrint llrint
(C++11) (C++11) (C++11)
Floating point manipulation functions
(C++11) (C++11)
(C++11)
(C++11)
Classification and comparison
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Types
(C++11)
(C++11)
(C++11)
Macro constants
Определено в заголовке <cmath>
Округление до типов с плавающей точкой
(1)
float rint ( float num ) ;

double rint ( double num ) ;

long double rint ( long double num ) ;
(начиная с C++11)
(до C++23)
/* floating-point-type */ rint ( /* floating-point-type */ num ) ;
(начиная с C++23)
float rintf ( float num ) ;
(2) (начиная с C++11)
long double rintl ( long double num ) ;
(3) (начиная с C++11)
Округление до long
(4)
long lrint ( float num ) ;

long lrint ( double num ) ;

long lrint ( long double num ) ;
(начиная с C++11)
(до C++23)
long lrint ( /* floating-point-type */ num ) ;
(начиная с C++23)
long lrintf ( float num ) ;
(5) (начиная с C++11)
long lrintl ( long double num ) ;
(6) (начиная с C++11)
Округление до long long
(7)
long long llrint ( float num ) ;

long long llrint ( double num ) ;

long long llrint ( long double num ) ;
(начиная с C++11)
(до C++23)
long long llrint ( /* floating-point-type */ num ) ;
(начиная с C++23)
long long llrintf ( float num ) ;
(8) (начиная с C++11)
long long llrintl ( long double num ) ;
(9) (начиная с C++11)
Определено в заголовке <cmath>
template < class Integer >
double rint ( Integer num ) ;
(A) (начиная с C++11)
template < class Integer >
long lrint ( Integer num ) ;
(B) (начиная с C++11)
template < class Integer >
long long llrint ( Integer num ) ;
(C) (начиная с C++11)
1-3) Округляет аргумент с плавающей точкой num до целочисленного значения (в формате с плавающей точкой), используя текущий режим округления . Библиотека предоставляет перегрузки std::rint для всех неквалифицированных cv типов с плавающей точкой в качестве типа параметра num . (начиная с C++23)
4-9) Округляет аргумент с плавающей точкой num до целочисленного значения, используя текущий режим округления . Библиотека предоставляет перегрузки std::lrint и std::llrint для всех неквалифицированных cv типов с плавающей точкой в качестве типа параметра num . (начиная с C++23)
A-C) Дополнительные перегрузки предоставляются для всех целочисленных типов, которые обрабатываются как double .

Содержание

Параметры

num - значение с плавающей точкой или целочисленное значение

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

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

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

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

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

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

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

Примечания

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

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

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

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

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

Дополнительные перегрузки не обязаны быть предоставлены в точности как (A-C) . Они должны быть лишь достаточными для обеспечения того, чтобы для их аргумента num целочисленного типа:

  • std :: rint ( num ) имеет тот же эффект, что и std :: rint ( static_cast < double > ( num ) ) .
  • std :: lrint ( num ) имеет тот же эффект, что и std :: lrint ( static_cast < double > ( num ) ) .
  • std :: llrint ( num ) имеет тот же эффект, что и std :: llrint ( static_cast < double > ( num ) ) .

Пример

#include <cfenv>
#include <climits>
#include <cmath>
#include <iostream>
// #pragma STDC FENV_ACCESS ON
int main()
{
    std::fesetround(FE_TONEAREST);
    std::cout << "Округление к ближайшему (половинные случаи к чётному):\n"
              << "  rint(+2.3) = " << std::rint(2.3) << '\n'
              << "  rint(+2.5) = " << std::rint(2.5) << '\n'
              << "  rint(+3.5) = " << std::rint(3.5) << '\n'
              << "  rint(-2.3) = " << std::rint(-2.3) << '\n'
              << "  rint(-2.5) = " << std::rint(-2.5) << '\n'
              << "  rint(-3.5) = " << std::rint(-3.5) << '\n';
    std::fesetround(FE_DOWNWARD);
    std::cout << "Округление в меньшую сторону:\n"
              << "  rint(+2.3) = " << std::rint(2.3) << '\n'
              << "  rint(+2.5) = " << std::rint(2.5) << '\n'
              << "  rint(+3.5) = " << std::rint(3.5) << '\n'
              << "  rint(-2.3) = " << std::rint(-2.3) << '\n'
              << "  rint(-2.5) = " << std::rint(-2.5) << '\n'
              << "  rint(-3.5) = " << std::rint(-3.5) << '\n'
              << "Округление вниз с помощью lrint:\n"
              << "  lrint(+2.3) = " << std::lrint(2.3) << '\n'
              << "  lrint(+2.5) = " << std::lrint(2.5) << '\n'
              << "  lrint(+3.5) = " << std::lrint(3.5) << '\n'
              << "  lrint(-2.3) = " << std::lrint(-2.3) << '\n'
              << "  lrint(-2.5) = " << std::lrint(-2.5) << '\n'
              << "  lrint(-3.5) = " << std::lrint(-3.5) << '\n'
              << "Специальные значения:\n"
              << "  lrint(-0.0) = " << std::lrint(-0.0) << '\n'
              << std::hex << std::showbase
              << "  lrint(-Inf) = " << std::lrint(-INFINITY) << '\n';
    // обработка ошибок
    std::feclearexcept(FE_ALL_EXCEPT);
    std::cout << "std::rint(0.1) = " << std::rint(.1) << '\n';
    if (std::fetestexcept(FE_INEXACT))
        std::cout << "  Было поднято исключение FE_INEXACT\n";
    std::feclearexcept(FE_ALL_EXCEPT);
    std::cout << "std::lrint(LONG_MIN-2048.0) = "
              << std::lrint(LONG_MIN - 2048.0) << '\n';
    if (std::fetestexcept(FE_INVALID))
        std::cout << "  FE_INVALID был поднят\n";
}

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

Округление к ближайшему (половинные случаи к четному):
  rint(+2.3) = 2
  rint(+2.5) = 2
  rint(+3.5) = 4
  rint(-2.3) = -2
  rint(-2.5) = -2
  rint(-3.5) = -4
Округление вниз:
  rint(+2.3) = 2
  rint(+2.5) = 2
  rint(+3.5) = 4
  rint(-2.3) = -2
  rint(-2.5) = -2
  rint(-3.5) = -4
Округление вниз с 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) = 0x8000000000000000
std::rint(0.1) = 0
std::lrint(LONG_MIN-2048.0) = 0x8000000000000000
  FE_INVALID был поднят

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

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