名前空間
変種
操作

std::round, std::lround, std::llround

提供: cppreference.com
< cpp‎ | numeric‎ | math
 
 
 
一般的な数学関数
関数
基本的な演算
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
指数関数
(C++11)
(C++11)
(C++11)
(C++11)
冪関数
(C++11)
(C++11)
三角関数と双曲線関数
(C++11)
(C++11)
(C++11)
誤差関数とガンマ関数
(C++11)
(C++11)
(C++11)
(C++11)
最も近い整数
roundlroundllround
(C++11)(C++11)(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
浮動小数点操作関数
(C++11)(C++11)
(C++11)
(C++11)
(C++11)(C++11)
(C++11)
分類および比較
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
マクロ定数
(C++11)(C++11)(C++11)(C++11)(C++11)
 
ヘッダ <cmath> で定義
float round( float arg );
(1) (C++11およびそれ以降)
double round( double arg );
(2) (C++11およびそれ以降)
long double round( long double arg );
(3) (C++11およびそれ以降)
double round( Integral arg );
(4) (C++11およびそれ以降)
long lround( float arg );
(5) (C++11およびそれ以降)
long lround( double arg );
(6) (C++11およびそれ以降)
long lround( long double arg );
(7) (C++11およびそれ以降)
long lround( Integral arg );
(8) (C++11およびそれ以降)
long long llround( float arg );
(9) (C++11およびそれ以降)
long long llround( double arg );
(10) (C++11およびそれ以降)
long long llround( long double arg );
(11) (C++11およびそれ以降)
long long llround( Integral arg );
(12) (C++11およびそれ以降)
1-3) (浮動小数点形式の) arg に最も近い整数値を計算します。 中間の場合はゼロから離れる方向に丸められます。 現在の丸めモードは影響しません。
5-7, 9-11) (整数形式の) arg に最も近い整数値を計算します。 中間の場合はゼロから離れる方向に丸められます。 現在の丸めモードは影響しません。
4,8,12) 任意の整数型の引数を受け取るオーバーロード集合または関数テンプレート。 それぞれ 2)、 6) または 10) と同等です (引数は double にキャストされます)。

目次

[編集] 引数

arg - 浮動小数点値

[編集] 戻り値

エラーが発生しなければ、 arg に最も近い (中間の場合はゼロから離れる方向に丸めた) 整数値が返されます。

戻り値
math-round away zero.svg
引数

定義域エラーが発生した場合、処理系定義の値が返されます。

[編集] エラー処理

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 または llroundFE_INEXACT を発生するすべてのケースは定義域エラーであると規定しています

std::rounddouble 版は以下のように実装されているかのように動作します。

#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;
}

[編集]

#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

[編集] 関連項目

指定された値より大きくない最も近い整数を返します
(関数) [edit]
指定された値より小さくない最も近い整数を返します
(関数) [edit]
(C++11)
指定された値より絶対値が大きくない最も近い整数を返します
(関数) [edit]