名稱空間
變體
操作

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

來自 cppreference.com
< c‎ | 數值‎ | 數學
 
 
 
常用數學函式
函式
基本操作
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
最大值/最小值操作
(C99)
(C99)
指數函式
(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)

rintlrintllrint
(C99)(C99)(C99)
(C23)(C23)(C23)(C23)
浮點數操作
(C99)(C99)
(C99)(C23)
(C99)
窄化操作
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量子與量子指數
十進位制重新編碼函式
總序和載荷函式
分類
(C99)
(C99)
(C99)
(C23)
誤差函式和伽馬函式
(C99)
(C99)
(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 - 浮點值

[編輯] 返回值

如果沒有發生錯誤,則返回 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("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 raised
 
    // error handling
    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

[編輯] 參考

  • C23 標準 (ISO/IEC 9899:2024)
  • 7.12.9.4 rint 函式 (p: 待定)
  • 7.12.9.5 lrint 和 llrint 函式 (p: 待定)
  • 7.25 型別通用數學 <tgmath.h> (p: TBD)
  • F.10.6.4 rint 函式 (p: 待定)
  • F.10.6.5 lrint 和 llrint 函式 (p: 待定)
  • 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 函式 (p: 232-233)
  • 7.12.9.5 lrint 和 llrint 函式 (p: 233)
  • 7.22 型別通用數學 <tgmath.h> (p: 335-337)
  • F.9.6.4 rint 函式 (p: 463)
  • F.9.6.5 lrint 和 llrint 函式 (p: 463)

[編輯] 另請參閱

(C99)(C99)(C99)
將數字截斷到最接近的整數,其絕對值不大於給定值
(函式) [編輯]
使用當前舍入模式四捨五入到整數
(函式) [編輯]
獲取或設定舍入方向
(函式) [編輯]
C++ 文件 關於 rint