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
で規定されているように、
FE_INEXACT
は、非整数の有限値を丸める際に
rint
によって(IEEE浮動小数点プラットフォーム以外では必須ではないが)発生する可能性があります。
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("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: 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関数群 (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)
|
指定された値の絶対値以下の最も近い整数に丸める
(関数) |
|
(C99)
(C99)
(C99)
|
現在の丸めモードを使用して整数に丸める
(関数) |
|
(C99)
(C99)
|
丸め方向を取得または設定する
(関数) |
|
C++ documentation
for
rint
|
|