rint, rintf, rintl, lrint, lrintf, lrintl, llrint, llrintf, llrintl
来自cppreference.com
常用数学函数
函数
基本运算
最大/最小运算
(C23)
(C23)
(C23)
(C23)
(C23)
指数函数
幂函数
三角及双曲函数
浮点数的临近整数
浮点数操作
窄化运算
量与量指数函数
(C23)
(C23)
(C23)
(C23)
十进制重编码函数
(C23)
(C23)
(C23)
(C23)
全序与载荷函数
(C23)
(C23)
(C23)
(C23)
分类
(C99)
(C23)
(C99)
(C99)
(C99)
(C99)
(C99)
(C23)
(C23)
(C99)
(C99)
(C99)
(C99)
(C99)
(C99)
(C23)
(C23)
误差及伽马函数
类型
(C99)(C99)
(C99)(C99)
(C23)(C23)
宏常量
特殊浮点数值
(C99)(C99)(C23)
(C99)(C23)
(C99)(C23)
参数与返回值
(C99)(C99)
(C99)(C99)(C99)(C99)(C99)
(C23)(C23)
(C23)(C23)(C23)(C23)(C23)
错误处理
(C99)(C99)
(C99)
快速运算指示
(C99)(C99)
(C23)(C23)(C23)(C23)
(C23)(C23)(C23)(C23)
(C23)(C23)(C23)(C23)
(C99)(C23)
(C23)(C23)(C23)(C23)
(C23)(C23)(C23)(C23)
(C23)(C23)(C23)(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 起)
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 )。
若当前舍入模式为......
- FE_DOWNWARD ,则
rint
等价于 floor 。 - FE_UPWARD ,则
rint
等价于 ceil 。 - FE_TOWARDZERO ,则
rint
等价于 trunc 。 - FE_TONEAREST ,则
rint
在中点情况和 round 的区别是前者始终舍入到偶数,而非远离零。
[编辑] 示例
运行此代码
#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 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"); }
可能的输出:
向临近舍入(半值舍入为偶数): 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 was raised lrint(LONG_MIN-2048.0) = -9223372036854775808 FE_INVALID was raised
[编辑] 引用
- C23 标准(ISO/IEC 9899:2024):
- 7.12.9.4 The rint functions (第 TBD 页)
- 7.12.9.5 The lrint and llrint functions (第 TBD 页)
- 7.25 Type-generic math <tgmath.h> (第 TBD 页)
- F.10.6.4 The rint functions (第 TBD 页)
- F.10.6.5 The lrint and llrint functions (第 TBD 页)
- C17 标准(ISO/IEC 9899:2018):
- 7.12.9.4 The rint functions (第 184 页)
- 7.12.9.5 The lrint and llrint functions (第 184 页)
- 7.25 Type-generic math <tgmath.h> (第 272-273 页)
- F.10.6.4 The rint functions (第 384 页)
- F.10.6.5 The lrint and llrint functions (第 384 页)
- C11 标准(ISO/IEC 9899:2011):
- 7.12.9.4 The rint functions (第 252 页)
- 7.12.9.5 The lrint and llrint functions (第 252 页)
- 7.25 Type-generic math <tgmath.h> (第 373-375 页)
- F.10.6.4 The rint functions (第 527 页)
- F.10.6.5 The lrint and llrint functions (第 527 页)
- C99 标准(ISO/IEC 9899:1999):
- 7.12.9.4 The rint functions (第 232-233 页)
- 7.12.9.5 The lrint and llrint functions (第 233 页)
- 7.22 Type-generic math <tgmath.h> (第 335-337 页)
- F.9.6.4 The rint functions (第 463 页)
- F.9.6.5 The lrint and llrint functions (第 463 页)
[编辑] 参阅
rint 的 C++ 文档