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 のオーバーロードを提供します。(since C++23)std::lrint および std::llrint のオーバーロードを提供します。(since C++23)目次 |
[編集] Parameters
| num | - | 浮動小数点数または整数値 |
[編集] Return value
エラーが発生しなかった場合、現在の丸めモードに従って、num に最も近い整数値が返されます。
[編集] Error handling
エラーは 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 が発生し、実装定義の値が返されます。
[編集] Notes
POSIX は、std::lrint または std::llrint が FE_INEXACT を発生させるすべてのケースがドメインエラーであると規定しています。
math_errhandling で指定されているように、有限の非整数値を丸める際に std::rint は FE_INEXACT を(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)) と同じ効果を持ちます。
[編集] Example
#include <cfenv> #include <climits> #include <cmath> #include <iostream> // #pragma STDC FENV_ACCESS ON int main() { std::fesetround(FE_TONEAREST); std::cout << "Rounding to nearest (halfway cases to even):\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 << "Rounding down:\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' << "Rounding down with 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' << "Special values:\n" << " lrint(-0.0) = " << std::lrint(-0.0) << '\n' << std::hex << std::showbase << " lrint(-Inf) = " << std::lrint(-INFINITY) << '\n'; // error handling std::feclearexcept(FE_ALL_EXCEPT); std::cout << "std::rint(0.1) = " << std::rint(.1) << '\n'; if (std::fetestexcept(FE_INEXACT)) std::cout << " FE_INEXACT was raised\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 was raised\n"; }
実行結果の例
Rounding to nearest (halfway cases to even): rint(+2.3) = 2 rint(+2.5) = 2 rint(+3.5) = 4 rint(-2.3) = -2 rint(-2.5) = -2 rint(-3.5) = -4 Rounding down: rint(+2.3) = 2 rint(+2.5) = 2 rint(+3.5) = 4 rint(-2.3) = -2 rint(-2.5) = -2 rint(-3.5) = -4 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 Special values: lrint(-0.0) = 0 lrint(-Inf) = 0x8000000000000000 std::rint(0.1) = 0 std::lrint(LONG_MIN-2048.0) = 0x8000000000000000 FE_INVALID was raised
[編集] See also
| (C++11)(C++11)(C++11) |
与えられた値の絶対値以下の最大の整数 (関数) |
| (C++11)(C++11)(C++11) |
現在の丸めモードを使用して最近接整数を求める (関数) |
| (C++11)(C++11) |
丸め方向を取得または設定する (関数) |
| C documentation for rint
| |