round, roundf, roundl, lround, lroundf, lroundl, llround, llroundf, llroundl
来自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 roundf( float arg );
(1)
(C99 起)
double round( double arg );
(2)
(C99 起)
long double roundl( long double arg );
(3)
(C99 起)
在标头
<tgmath.h>
定义
#define round( arg )
(4)
(C99 起)
在标头
<math.h>
定义
long lroundf( float arg );
(5)
(C99 起)
long lround( double arg );
(6)
(C99 起)
long lroundl( long double arg );
(7)
(C99 起)
在标头
<tgmath.h>
定义
#define lround( arg )
(8)
(C99 起)
在标头
<math.h>
定义
long long llroundf( float arg );
(9)
(C99 起)
long long llround( double arg );
(10)
(C99 起)
long long llroundl( long double arg );
(11)
(C99 起)
在标头
<tgmath.h>
定义
#define llround( arg )
(12)
(C99 起)
1-3) 计算与 arg 最邻近的整数(以浮点数格式),中点情况取远离零者,无关乎当前舍入模式。
5-7, 9-11) 计算与 arg 最邻近的整数(以整数格式),中点情况取远离零者,无关乎当前舍入模式。
4,8,12) 泛型宏:若 arg 拥有 long double 类型,则分别调用
roundl
、lroundl
、llroundl
。否则,若 arg 拥有整数类型或 double 类型,则分别调用 round
、lround
、llround
。否则分别调用 roundf
、lroundf
、llroundf
。[编辑] 参数
arg
-
浮点数
[编辑] 返回值
若不出现错误,则与返回 arg 的最邻近整数,中点情况取远离零者,
若出现定义域错误,则返回实现定义值。
[编辑] 错误处理
报告 math_errhandling
中指定的错误。
若 lround
或 llround
的结果在返回类型的可表示范围外,则可能出现定义域错误或值域错误。
若实现支持 IEEE 浮点数算术(IEC 60559),
- 对于
round
、roundf
及roundl
函数:- 当前舍入模式无效。
- 若 arg 为 ±∞,则返回未修改的该值。
- 若 arg 为 ±0,则返回未修改的该值。
- 若 arg 为 NaN,则返回 NaN。
- 对于
lround
与llround
函数族:- 决不引发 FE_INEXACT 。
- 当前舍入模式无效。
- 若 arg 为 ±∞,则引发 FE_INVALID 并返回实现定义值。
- 若舍入结果在返回类型的范围外,则引发 FE_INVALID 并返回实现定义值。
- 若 arg 为 NaN,则引发 FE_INVALID 并返回实现定义值。
[编辑] 注解
round
在舍入非整数有限值时,可以(但不要求)引发 FE_INEXACT 。
所有标准浮点数格式中,最大可表示浮点数均为准确的整数,故 round
自身决不上溢;然而在存储于整数对象时,结果可能溢出任何整数类型(包含 intmax_t )。
POSIX 指定 lround
或 llround
引发 FE_INEXACT 的所有情况都是定义域错误。
round
的 double 版本如同实现如下:
[编辑] 示例
运行此代码
#include <assert.h> #include <fenv.h> #include <float.h> #include <limits.h> #include <math.h> #include <stdio.h> // #pragma STDC FENV_ACCESS ON double custom_round(double x) { return signbit (x) ? ceil (x - 0.5) : floor (x + 0.5); } void test_custom_round() { const double sample[] = { 0.0, 2.3, 2.5 - DBL_EPSILON, 2.5, 2.5 + DBL_EPSILON, 2.7, INFINITY }; for (size_t t = 0; t < sizeof sample / sizeof(double); ++t) assert (round(+sample[t]) == custom_round(+sample[t]) && round(-sample[t]) == custom_round(-sample[t])); } int main(void) { // round printf ("round(+2.3) = %+.1f ", round(2.3)); printf ("round(+2.5) = %+.1f ", round(2.5)); printf ("round(+2.7) = %+.1f\n", round(2.7)); printf ("round(-2.3) = %+.1f ", round(-2.3)); printf ("round(-2.5) = %+.1f ", round(-2.5)); printf ("round(-2.7) = %+.1f\n", round(-2.7)); printf ("round(-0.0) = %+.1f\n", round(-0.0)); printf ("round(-Inf) = %+f\n", round(-INFINITY)); test_custom_round(); // lround printf ("lround(+2.3) = %+ld ", lround(2.3)); printf ("lround(+2.5) = %+ld ", lround(2.5)); printf ("lround(+2.7) = %+ld\n", lround(2.7)); printf ("lround(-2.3) = %+ld ", lround(-2.3)); printf ("lround(-2.5) = %+ld ", lround(-2.5)); printf ("lround(-2.7) = %+ld\n", lround(-2.7)); printf ("lround(-0.0) = %+ld\n", lround(-0.0)); printf ("lround(-Inf) = %+ld\n", lround(-INFINITY)); // 引发 FE_INVALID // 错误处理 feclearexcept (FE_ALL_EXCEPT ); printf ("lround(LONG_MAX+1.5) = %ld\n", lround(LONG_MAX + 1.5)); if (fetestexcept (FE_INVALID )) puts (" 引发了 FE_INVALID"); }
可能的输出:
round(+2.3) = +2.0 round(+2.5) = +3.0 round(+2.7) = +3.0 round(-2.3) = -2.0 round(-2.5) = -3.0 round(-2.7) = -3.0 round(-0.0) = -0.0 round(-Inf) = -inf lround(+2.3) = +2 lround(+2.5) = +3 lround(+2.7) = +3 lround(-2.3) = -2 lround(-2.5) = -3 lround(-2.7) = -3 lround(-0.0) = +0 lround(-Inf) = -9223372036854775808 lround(LONG_MAX+1.5) = -9223372036854775808 引发了 FE_INVALID
[编辑] 引用
- C23 标准(ISO/IEC 9899:2024):
- 7.12.9.6 The round functions (第 TBD 页)
- 7.12.9.7 The lround and llround functions (第 TBD 页)
- 7.25 Type-generic math <tgmath.h> (第 TBD 页)
- F.10.6.6 The round functions (第 TBD 页)
- F.10.6.7 The lround and llround functions (第 TBD 页)
- C17 标准(ISO/IEC 9899:2018):
- 7.12.9.6 The round functions (第 184 页)
- 7.12.9.7 The lround and llround functions (第 184-185 页)
- 7.25 Type-generic math <tgmath.h> (第 272-273 页)
- F.10.6.6 The round functions (第 384 页)
- F.10.6.7 The lround and llround functions (第 385 页)
- C11 标准(ISO/IEC 9899:2011):
- 7.12.9.6 The round functions (第 253 页)
- 7.12.9.7 The lround and llround functions (第 253 页)
- 7.25 Type-generic math <tgmath.h> (第 373-375 页)
- F.10.6.6 The round functions (第 527 页)
- F.10.6.7 The lround and llround functions (第 528 页)
- C99 标准(ISO/IEC 9899:1999):
- 7.12.9.6 The round functions (第 233 页)
- 7.12.9.7 The lround and llround functions (第 234 页)
- 7.22 Type-generic math <tgmath.h> (第 335-337 页)
- F.9.6.6 The round functions (第 464 页)
- F.9.6.7 The lround and llround functions (第 464 页)
[编辑] 参阅
round 的 C++ 文档