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

来自cppreference.com
< c‎ | numeric‎ | math
 
 
 
常用数学函数
函数
基本运算
(C99)
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
最大/最小运算
(C99)
(C99)
(C23)
(C23)
(C23) 
指数函数
(C23)
(C99)
(C99)
(C23)
(C23)

(C99)
(C99)(C23)
(C23)
(C23)
幂函数
(C99)
(C23)
(C23)

(C99)
(C23)
(C23)
(C23)
三角及双曲函数
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
(C99)
(C99)
(C99)
浮点数的临近整数
(C99)(C99)(C99)
(C23)
(C99)

(C99)
rintlrintllrint
(C99)(C99)(C99)
(C23)(C23)(C23)(C23)
浮点数操作
(C99)(C99)
(C99)(C23)
(C99)
(C23)(C23)
(C99)
窄化运算
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量与量指数函数
十进制重编码函数
全序与载荷函数
分类
(C23) 
(C99)
(C99)
(C99)
(C99)
(C99)
(C23)
(C99)
(C99)  
(C99)
(C23)

误差及伽马函数
(C99)
(C99)
(C99)
(C99)
类型
宏常量
特殊浮点数值
参数与返回值
错误处理
快速运算指示
 
在标头 <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 ("向临近舍入(半值舍入为偶数):\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 页)

[编辑] 参阅

(C99)(C99)(C99)
取整到绝对值不大于给定值的最接近整数
(函数) [编辑]
用当前舍入模式取整到整数
(函数) [编辑]
获得或设置数字的舍入方向
(函数) [编辑]
rint 的 C++ 文档
来自"https://zh.cppreference.com/mwiki/index.php?title=c/numeric/math/rint&oldid=95983"

AltStyle によって変換されたページ (->オリジナル) /