命名空间
变体
操作

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

来自 cppreference.cn
< c‎ | 数值‎ | 数学
 
 
 
常用数学函数
函数
基本操作
(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

目录

[编辑] 参数

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: 待定)
  • 7.12.9.5 lrint 和 llrint 函数 (p: 待定)
  • 7.25 类型通用数学 <tgmath.h> (p: TBD)
  • 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)

[编辑] 另请参阅

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