web-dev-qa-db-ja.com

C ++ 11のstd :: nearbyintとstd :: round

C++ 11は std :: nearbyint および std :: round 関数を導入しました。どちらも「最も近い」整数値を返します。

いつ、どこでどちらを選ぶべきですか?

0.5の値でテストしました:

ケース1nearlyintのデモ

#include <iostream>
#include <cmath>

int main()
{
    std::cout<<"nearbyint(0.5) = "<<std::nearbyint(0.5);
}

出力:0

ケース2:ラウンドのデモ

#include <iostream>
#include <cmath>

int main()
{
    std::cout<<"round(0.5) = "<<std::round(0.5);
}

出力:1

なぜ出力が異なるのですか?

11
msc

std::round関数は 現在の丸めモード を無視しますが、std::nearbyintはそれを考慮します。丸めモードを変更できます。

#include <cfenv>
int main() {
    std::fesetround(FE_UPWARD);
    // perform calculations
    std::fesetround(FE_DOWNWARD);
    // perform calculations
    // other rounding methods...
}

さまざまな結果を観察します。現在の丸めモードの値を取得するには、 std :: fegetround() 関数を使用します。可能性はデフォルト(実装定義)値は0であり、これはFE_TONEARESTに変換されます。

20
Ron