rint, rintf, rintl, lrint, lrintf, lrintl, llrint, llrintf, llrintl
|
定义于头文件
<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 起) |
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异常"); 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)
|
向绝对值不大于给定值的最近整数舍入
(函数) |
|
(C99)
(C99)
(C99)
|
使用当前舍入模式向整数舍入
(函数) |
|
(C99)
(C99)
|
获取或设置舍入方向
(函数) |
|
C++ 文档
for
rint
|
|