std::round, std::roundf, std::roundl, std::lround, std::lroundf, std::lroundl, std::llround, std::llroundf
提供: cppreference.com
ヘッダ <cmath> で定義
|
||
float round ( float arg ); float roundf( float arg ); |
(1) | (C++11以上) |
double round ( double arg ); |
(2) | (C++11以上) |
long double round ( long double arg ); long double roundl( long double arg ); |
(3) | (C++11以上) |
double round ( 整数型 arg ); |
(4) | (C++11以上) |
long lround ( float arg ); long lroundf( float arg ); |
(5) | (C++11以上) |
long lround ( double arg ); |
(6) | (C++11以上) |
long lround ( long double arg ); long lroundl( long double arg ); |
(7) | (C++11以上) |
long lround ( 整数型 arg ); |
(8) | (C++11以上) |
long long llround ( float arg ); long long llroundf( float arg ); |
(9) | (C++11以上) |
long long llround ( double arg ); |
(10) | (C++11以上) |
long long llround ( long double arg ); long long llroundl( long double arg ); |
(11) | (C++11以上) |
long long llround ( 整数型 arg ); |
(12) | (C++11以上) |
1-3) (浮動小数点形式の)
arg
に最も近い整数値を計算します。 中間の場合はゼロから離れる方向に丸められます。 現在の丸めモードは影響しません。5-7, 9-11) (整数形式の)
arg
に最も近い整数値を計算します。 中間の場合はゼロから離れる方向に丸められます。 現在の丸めモードは影響しません。目次 |
[編集] 引数
arg | - | 浮動小数点値 |
[編集] 戻り値
エラーが発生しなければ、 arg
に最も近い (中間の場合はゼロから離れる方向に丸めた) 整数値が返されます。
戻り値
引数
定義域エラーが発生した場合、処理系定義の値が返されます。
[編集] エラー処理
math_errhandling で規定されている通りにエラーが報告されます。
std::lround
または std::llround
の結果が戻り値の型で表現可能な範囲外の場合、定義域エラーまたは地域エラーが発生するかもしれません。
処理系が IEEE 浮動小数点算術 (IEC 60559) をサポートしている場合、
-
std::round
関数については
- 現在の丸めモードは効果を持ちません。
-
arg
が ±∞ であれば、それが変更されずに返されます。 -
arg
が ±0 であれば、それが変更されずに返されます。 -
arg
が NaN であれば、 NaN が返されます。
-
std::lround
およびstd::llround
関数については
- FE_INEXACT が発生することはありません。
- 現在の丸めモードは効果を持ちません。
-
arg
が ±∞ であれば、 FE_INVALID が発生し、処理系定義の値が返されます。 - 丸めの結果が戻り値の型の範囲外の場合、 FE_INVALID が発生し、処理系定義の値が返されます。
-
arg
が NaN であれば、 FE_INVALID が発生し、処理系定義の値が返されます。
[編集] ノート
非整数の有限な値を丸めるとき、 std::round
によって FE_INEXACT が発生す��かもしれません (が要求されているわけではありません)。
すべての標準の浮動小数点フォーマットにおいて、最も大きな表現可能な浮動小数点値は正確な整数であるため、 std::round
それ自体はオーバーフローすることはありません。 しかし任意の整数型 (std::intmax_t も含みます) は、整数変数に格納するとき、結果がオーバーフローするかもしれません。
POSIX は、 lround
または llround
が FE_INEXACT を発生するすべてのケースは定義域エラーであると規定しています。
std::round
の double 版は以下のように実装されているかのように動作します。
#include <cmath> #include <cfenv> #pragma STDC FENV_ACCESS ON double round(double x) { std::fenv_t save_env; std::feholdexcept(&save_env); double result = std::rint(x); if (std::fetestexcept(FE_INEXACT)) { auto const save_round = std::fegetround(); std::fesetround(FE_TOWARDZERO); result = std::rint(std::copysign(0.5 + std::fabs(x), x)); std::fesetround(save_round); } std::feupdateenv(&save_env); return result; }
[編集] 例
Run this code
#include <iostream> #include <cmath> #include <cfenv> #include <climits> #pragma STDC FENV_ACCESS ON int main() { // round std::cout << "round(+2.3) = " << std::round(2.3) << " round(+2.5) = " << std::round(2.5) << " round(+2.7) = " << std::round(2.7) << '\n' << "round(-2.3) = " << std::round(-2.3) << " round(-2.5) = " << std::round(-2.5) << " round(-2.7) = " << std::round(-2.7) << '\n'; std::cout << "round(-0.0) = " << std::round(-0.0) << '\n' << "round(-Inf) = " << std::round(-INFINITY) << '\n'; // lround std::cout << "lround(+2.3) = " << std::lround(2.3) << " lround(+2.5) = " << std::lround(2.5) << " lround(+2.7) = " << std::lround(2.7) << '\n' << "lround(-2.3) = " << std::lround(-2.3) << " lround(-2.5) = " << std::lround(-2.5) << " lround(-2.7) = " << std::lround(-2.7) << '\n'; std::cout << "lround(-0.0) = " << std::lround(-0.0) << '\n' << "lround(-Inf) = " << std::lround(-INFINITY) << '\n'; // error handling std::feclearexcept(FE_ALL_EXCEPT); std::cout << "std::lround(LONG_MAX+1.5) = " << std::lround(LONG_MAX+1.5) << '\n'; if(std::fetestexcept(FE_INVALID)) std::cout << " FE_INVALID was raised\n"; }
出力例:
round(+2.3) = 2 round(+2.5) = 3 round(+2.7) = 3 round(-2.3) = -2 round(-2.5) = -3 round(-2.7) = -3 round(-0.0) = -0 round(-Inf) = -inf lround(+2.3) = 2 lround(+2.5) = 3 lround(+2.7) = 3 lround(-2.3) = -2 lround(-2.5) = -3 lround(-2.7) = -3 lround(-0.0) = 0 lround(-Inf) = -9223372036854775808 std::lround(LONG_MAX+1.5) = -9223372036854775808 FE_INVALID was raised
[編集] 関連項目
(C++11)(C++11) |
指定された値より大きくない最も近い整数を返します (関数) |
(C++11)(C++11) |
指定された値より小さくない最も近い整数を返します (関数) |
(C++11)(C++11)(C++11) |
指定された値より絶対値が大きくない最も近い整数を返します (関数) |
round の C言語リファレンス
|