命名空间
变体
操作

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

来自 cppreference.com
< c‎ | numeric‎ | math
 
 
 
通用数学函数
类型
(C99)(C99)    

(C99)(C99)    

函数
基本运算
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
最大/最小运算
(C99)
(C23)    
指数函数
(C23)
(C99)
(C99)
(C23)
(C23)
(C99)
(C99)(C23)
(C23)
(C23)
幂函数
(C99)
(C23)
(C23)
(C99)
(C23)
(C23)
三角函数和双曲函数
(C23)
(C23)
(C23)
(C23)
(C99)
(C99)
(C99)
误差函数和伽玛函数
(C99)
(C99)
(C99)
(C99)
最接近整数浮点运算
(C99)(C99)(C99)
(C99)
rintlrintllrint
(C99)(C99)(C99)
(C23)(C23)(C23)(C23)
浮点操作函数
(C99)(C99)
(C99)(C23)
(C99)
缩窄操作
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量子和量子指数函数
十进制重新编码函数
全序和有效载荷函数
分类
(C99)
(C99)
(C99)
(C23)
宏常量
特殊浮点值
(C99)(C23)
参数和返回值
(C99)(C99)(C99)(C99)(C99)    
错误处理
(C99)    

 
在头文件 <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,则调用 rintllrintlllrintl。否则,如果 arg 为整数类型或 double 类型,则分别调用 rintlrintllrint。否则,分别调用 rintflrintfllrintf

内容

[编辑] 参数

arg - 浮点值

[编辑] 返回值

如果未发生错误,则返回根据 当前舍入模式 最接近 arg 的整数值。

[编辑] 错误处理

错误报告方式如 math_errhandling 中所述。

如果 lrintllrint 的结果超出返回类型所能表示的范围,则可能发生域错误或范围错误。

如果实现支持 IEEE 浮点运算(IEC 60559),则

对于 rint 函数
  • 如果 arg 为 ±∞,则直接返回其值。
  • 如果 arg 为 ±0,则直接返回其值。
  • 如果 arg 为 NaN,则返回 NaN。
对于 lrintllrint 函数
  • 如果 arg 为 ±∞,则引发 FE_INVALID 并返回一个实现定义的值。
  • 如果舍入结果超出返回类型的范围,则引发 FE_INVALID 并返回一个实现定义的值。
  • 如果 arg 是 NaN,则会引发 FE_INVALID 异常,并返回一个实现定义的值。

[编辑] 注释

POSIX 规范 规定,所有导致 lrintllrint 引发 FE_INEXACT 异常的情况都是域错误。

math_errhandling 中所述,在对非整数有限值进行舍入时,rint 可能(但在非 IEEE 浮点平台上并非必需)会引发 FE_INEXACT 异常。

rintnearbyint 之间的唯一区别在于 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("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

[编辑] 参考文献

  • 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 函数 (p: 232-233)
  • 7.12.9.5 lrint 和 llrint 函数 (p: 233)
  • 7.22 类型泛型数学 <tgmath.h> (p: 335-337)
  • F.9.6.4 rint 函数 (p: 463)
  • F.9.6.5 lrint 和 llrint 函数 (p: 463)

[编辑] 另请参阅

(C99)(C99)(C99)
舍入到最接近的整数,该整数的绝对值不超过给定值。
(函数) [编辑]
使用当前舍入模式舍入到整数。
(函数) [编辑]
获取或设置舍入方向。
(函数) [编辑]
C++ 文档rint