Namespaces
Variants

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

From 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 舍入为整数值(以浮点格式表示),使用 当前舍入模式 库为所有 cv-未限定浮点类型提供了 std::rint 的重载,作为参数 num 的类型。 (C++23 起)
4-9) 使用 当前舍入模式 将浮点参数 num 舍入为整数值。 库为所有 cv 未限定浮点类型提供了 std::lrint std::llrint 的重载,作为参数 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 所规定,当对非整数有限值进行舍入时, std::rint 可能(但在非IEEE浮点数平台上不强制要求)引发 FE_INEXACT

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::<

参见

(C++11) (C++11) (C++11)
不大于给定值绝对值的最近整数
(函数)
(C++11) (C++11) (C++11)
使用当前舍入模式的最近整数
(函数)
(C++11) (C++11)
获取或设置舍入方向
(函数)
C 文档 for rint