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 所规定,当对非整数有限值进行舍入时, rint 可能(但在非IEEE浮点平台上不强制要求)引发 FE_INEXACT

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异常
    // 错误处理
    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 函数集 (p: TBD)
  • 7.12.9.5 lrint 和 llrint 函数集 (p: TBD)
  • 7.25 泛型数学 <tgmath.h> (p: TBD)
  • F.10.6.4 rint 函数集 (p: TBD)
  • F.10.6.5 lrint 和 llrint 函数集 (p: TBD)
  • C17 标准 (ISO/IEC 9899:2018):
  • 7.12.9.4 rint 函数集 (p: 184)
  • 7.12.9.5 lrint 和 llrint 函数集 (p: 184)
  • 7.25 泛型数学 <tgmath.h> (p: 272-273)
  • F.10.6.4 rint 函数集 (p: 384)
  • F.10.6.5 lrint 和 llrint 函数集 (p: 384)
  • C11 标准 (ISO/IEC 9899:2011):
  • 7.12.9.4 rint 函数集 (p: 252)
  • 7.12.9.5 lrint 和 llrint 函数集 (p: 252)
  • 7.25 泛型数学 <tgmath.h> (p: 373-375)
  • F.10.6.4 rint 函数集 (p: 527)
  • F.10.6.5 lrint 和 llrint 函数集 (p: 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)
向绝对值不大于给定值的最近整数舍入
(函数)
使用当前舍入模式向整数舍入
(函数)
获取或设置舍入方向
(函数)
C++ 文档 for rint