命名空间
变体
操作

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

来自 cppreference.cn
< c‎ | numeric‎ | math
 
 
 
常用数学函数
函数
基本操作
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
最大值/最小值操作
(C99)
(C99)
指数函数
(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)

rintlrintllrint
(C99)(C99)(C99)
(C23)(C23)(C23)(C23)
浮点数操作
(C99)(C99)
(C99)(C23)
(C99)
窄化操作
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量子和量子指数
十进制重编码函数
总阶数和有效载荷函数
分类
(C99)
(C99)
(C99)
(C23)
错误函数和伽玛函数
(C99)
(C99)
(C99)
(C99)
类型
宏常量
特殊浮点数值
(C99)(C23)
参数和返回值
错误处理
快速运算指示符
 
定义于头文件 <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

目录

[edit] 参数

arg - 浮点数值

[edit] 返回值

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

[edit] 错误处理

错误按照 math_errhandling 中指定的进行报告。

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

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

对于 rint 函数
  • 如果 arg 是 ±∞,则返回,不修改。
  • 如果 arg 是 ±0,则返回,不修改。
  • 如果 arg 是 NaN,则返回 NaN。
对于 lrintllrint 函数
  • 如果 arg 是 ±∞,则引发 FE_INVALID 并返回实现定义的值。
  • 如果舍入的结果超出返回类型的范围,则引发 FE_INVALID 并返回实现定义的值。
  • 如果 arg 是 NaN,则引发 FE_INVALID 并返回实现定义的值。

[edit] 注意

POSIX 规范 指出,所有 lrintllrint 引发 FE_INEXACT 的情况都是域错误。

正如 math_errhandling 中所指定的那样,当舍入非整数有限值时,rint 可能会(但非 IEEE 浮点平台上不是必需的)引发 FE_INEXACT

rintnearbyint 之间的唯一区别是 nearbyint 永远不会引发 FE_INEXACT

最大的可表示浮点数值在所有标准浮点格式中都是精确的整数,因此 rint 本身永远不会溢出;但是,当存储在整数变量中时,结果可能会溢出任何整数类型(包括 intmax_t)。

如果当前的舍入模式是...

[edit] 示例

#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

[edit] 参考

  • C23 标准 (ISO/IEC 9899:2024)
  • 7.12.9.4 rint 函数 (p: 待定)
  • 7.12.9.5 lrint 和 llrint 函数 (p: 待定)
  • 7.25 类型泛型数学 <tgmath.h> (p: 待定)
  • F.10.6.4 rint 函数 (p: 待定)
  • F.10.6.5 lrint 和 llrint 函数 (p: 待定)
  • 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)

[edit] 参见

(C99)(C99)(C99)
舍入到最接近的整数,其幅度不大于给定值
(函数) [编辑]
使用当前的舍入模式舍入为整数
(函数) [编辑]
获取或设置舍入方向
(函数) [编辑]
C++ 文档 关于 rint