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

来自cppreference.com
< c‎ | numeric‎ | math
 
 
 
常用数学函数
函数
基本运算
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
最大/最小运算
指数函数
(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)
临近整数的浮点运算
(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)
类型
宏常量
 
在标头 <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 - 浮点值

返回值

若不出现错误,则按照当前舍入模式的最接近整数值。

错误处理

报告 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_errhandlingrint 在舍入非整数有限值时可以(但不在非 IEEE 浮点平台上要求)引发 FE_INEXACT

rintnearbyint 间仅有的区别是 nearbyint 决不引发 FE_INEXACT

所有标准浮点格式中,最大可表示浮点值都是准确的整数,故 rint 自身决不上溢;然而在存储结果于整数对象时,结果可能溢出任何整数类型(包含 intmax_t )。

若当前舍入模式为……

示例

#include <stdio.h>
#include <math.h>
#include <fenv.h>
#include <limits.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
 
    // 错误处理
    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

引用

  • 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)
取整到绝对值不大于给定值的最接近整数
(函数)
用当前舍入模式取整到整数
(函数)
获得或设置数字的舍入方向
(函数)