std:: rint, std:: rintf, std:: rintl, std:: lrint, std:: lrintf, std:: lrintl, std:: llrint, std:: llrintf
|
ヘッダーで定義
<cmath>
|
||
|
浮動小数点型への丸め
|
||
| (1) | ||
|
float
rint
(
float
num
)
;
double
rint
(
double
num
)
;
|
(C++11以降)
(C++23まで) |
|
|
/* floating-point-type */
rint
(
/* floating-point-type */
num
)
;
|
(C++23以降) | |
|
float
rintf
(
float
num
)
;
|
(2) | (C++11以降) |
|
long
double
rintl
(
long
double
num
)
;
|
(3) | (C++11以降) |
|
long
への丸め
|
||
| (4) | ||
|
long
lrint
(
float
num
)
;
long
lrint
(
double
num
)
;
|
(C++11以降)
(C++23まで) |
|
|
long
lrint
(
/* floating-point-type */
num
)
;
|
(C++23以降) | |
|
long
lrintf
(
float
num
)
;
|
(5) | (C++11以降) |
|
long
lrintl
(
long
double
num
)
;
|
(6) | (C++11以降) |
|
long
long
への丸め処理
|
||
| (7) | ||
|
long
long
llrint
(
float
num
)
;
long
long
llrint
(
double
num
)
;
|
(C++11以降)
(C++23まで) |
|
|
long
long
llrint
(
/* floating-point-type */
num
)
;
|
(C++23以降) | |
|
long
long
llrintf
(
float
num
)
;
|
(8) | (C++11以降) |
|
long
long
llrintl
(
long
double
num
)
;
|
(9) | (C++11以降) |
<cmath>
ヘッダーで定義
|
||
|
template
<
class
Integer
>
double rint ( Integer num ) ; |
(A) | (C++11以降) |
|
template
<
class
Integer
>
long lrint ( Integer num ) ; |
(B) | (C++11以降) |
|
template
<
class
Integer
>
long long llrint ( Integer num ) ; |
(C) | (C++11以降) |
std::rint
のオーバーロードを提供します。
(C++23以降)
std::lrint
および
std::llrint
のオーバーロードを提供します。
(C++23以降)
目次 |
パラメータ
| num | - | 浮動小数点または整数値 |
戻り値
エラーが発生しない場合、 num の現在の 丸めモード に従った最も近い整数値が返されます。
エラー処理
エラーは math_errhandling で指定された通りに報告されます。
std::lrint
または
std::llrint
の結果が戻り値の型で表現可能な範囲外である場合、ドメインエラーまたはレンジエラーが発生する可能性があります。
IEEE浮動小数点演算(IEC 60559)を実装がサポートしている場合、
-
std::rint関数について:
- num が±∞の場合、変更されずに返されます。
- num が±0の場合、変更されずに返されます。
- num がNaNの場合、NaNが返されます。
-
std::lrintおよびstd::llrint関数について:
- num が±∞の場合、 FE_INVALID が発生し、実装定義の値が返されます。
- 丸め結果が戻り値の型の範囲外の場合、 FE_INVALID が発生し、実装定義の値が返されます。
- num がNaNの場合、 FE_INVALID が発生し、実装定義の値が返されます。
注記
POSIXは
、
std::lrint
または
std::llrint
が
FE_INEXACT
を発生させるすべての場合が定義域エラーであることを規定しています。
math_errhandling
で規定されている通り、
FE_INEXACT
は非整数の有限値を丸める際に
std::rint
によって発生する可能性があります(ただしIEEE浮動小数点プラットフォーム以外では必須ではありません)。
std::rint
と
std::nearbyint
の唯一の違いは、
std::nearbyint
が決して
FE_INEXACT
を発生させないことです。
標準的な浮動小数点形式における最大表現可能な浮動小数点値はすべて正確な整数であるため、
std::rint
単体では決してオーバーフローを発生させない。しかしながら、結果が整数変数(
std::intmax_t
を含む)に格納される場合、あらゆる整数型でオーバーフローが発生する可能性がある。
現在の丸めモードが以下の場合:
-
FE_DOWNWARD
の場合、
std::rintは std::floor と等価です。 -
FE_UPWARD
の場合、
std::rintは std::ceil と等価です。 -
FE_TOWARDZERO
の場合、
std::rintは std::trunc と等価です。 -
FE_TONEAREST
の場合、
std::rintは std::round とは異なり、中間値の場合にゼロから遠ざけるのではなく偶数に丸められます。
追加のオーバーロードは (A-C) と完全に同一である必要はありません。これらは、整数型の引数 num に対して十分な保証を提供するだけで十分です:
- std :: rint ( num ) は std :: rint ( static_cast < double > ( num ) ) と同じ効果を持ちます。
- std :: lrint ( num ) は std :: lrint ( static_cast < double > ( num ) ) と同じ効果を持ちます。
- std :: llrint ( num ) は std :: llrint ( static_cast < double > ( num ) ) と同じ効果を持ちます。
例
#include <cfenv> #include <climits> #include <cmath> #include <iostream> // #pragma STDC FENV_ACCESS ON int main() { std::fesetround(FE_TONEAREST); std::cout << "最近接丸め(中間値は偶数方向):\n" << " rint(+2.3) = " << std::rint(2.3) << '\n' << " rint(+2.5) = " << std::rint(2.5) << '\n' << " rint(+3.5) = " << std::rint(3.5) << '\n' << " rint(-2.3) = " << std::rint(-2.3) << '\n' << " rint(-2.5) = " << std::rint(-2.5) << '\n' << " rint(-3.5) = " << std::rint(-3.5) << '\n'; std::fesetround(FE_DOWNWARD); std::cout << "切り捨て:\n" << " rint(+2.3) = " << std::rint(2.3) << '\n' << " rint(+2.5) = " << std::rint(2.5) << '\n' << " rint(+3.5) = " << std::rint(3.5) << '\n' << " rint(-2.3) = " << std::rint(-2.3) << '\n' << " rint(-2.5) = " << std::rint(-2.5) << '\n' << " rint(-3.5) = " << std::rint(-3.5) << '\n' << "lrintによる切り捨て:\n" << " lrint(+2.3) = " << std::lrint(2.3) << '\n' << " lrint(+2.5) = " << std::lrint(2.5) << '\n' << " lrint(+3.5) = " << std::lrint(3.5) << '\n' << " lrint(-2.3) = " << std::lrint(-2.3) << '\n' << " lrint(-2.5) = " << std::lrint(-2.5) << '\n' << " lrint(-3.5) = " << std::lrint(-3.5) << '\n' << "特殊な値:\n" << " lrint(-0.0) = " << std::lrint(-0.0) << '\n' << std::hex << std::showbase << " lrint(-Inf) = " << std::lrint(-INFINITY) << '\n'; // エラーハンドリング std::feclearexcept(FE_ALL_EXCEPT); std::cout << "std::rint(0.1) = " << std::rint(.1) << '\n'; if (std::fetestexcept(FE_INEXACT)) std::cout << " FE_INEXACT が発生しました\n"; std::feclearexcept(FE_ALL_EXCEPT); std::cout << "std::lrint(LONG_MIN-2048.0) = " << std::lrint(LONG_MIN - 2048.0) << '\n'; if (std::fetestexcept(FE_INVALID)) std::cout << "FE_INVALIDが発生しました\n"; }
出力例:
最近接丸め(中間値は偶数方向): rint(+2.3) = 2 rint(+2.5) = 2 rint(+3.5) = 4 rint(-2.3) = -2 rint(-2.5) = -2 rint(-3.5) = -4 下方丸め: rint(+2.3) = 2 rint(+2.5) = 2 rint(+3.5) = 4 rint(-2.3) = -2 rint(-2.5) = -2 rint(-3.5) = -4 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) = 0x8000000000000000 std::rint(0.1) = 0 std::lrint(LONG_MIN-2048.0) = 0x8000000000000000 FE_INVALIDが発生
関連項目
|
(C++11)
(C++11)
(C++11)
|
指定された値の絶対値以下の最も近い整数
(関数) |
|
(C++11)
(C++11)
(C++11)
|
現在の丸めモードを使用した最も近い整数
(関数) |
|
(C++11)
(C++11)
|
丸め方向の取得または設定
(関数) |
|
C documentation
for
rint
|
|