2017-11-07 5 views
3

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

いつどこで好きなのですか?

私は 0.5の値でそれらをテストしている

ケース1Demo for nearbyint

#include <iostream> 
#include <cmath> 

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

出力:0

ケース2:Demo for round

#include <iostream> 
#include <cmath> 

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

出力:1

なぜ出力が異なっていますか?

答えて

12

std::round関数はcurrent rounding modeを無視し、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に変換されます。

2

としては、Ron's answerで指摘一方rint()と一方nearbyint()、及びround()間の一つの違いは、後者は、現在有効なかかわらずダイナミック丸めモードの、固定丸めモードを使用することです。この詳細は2011年のISO C++標準では見つかりません。の26.8 Cライブラリ[c.math]はC標準を指しています。次のように1999 ISO C標準はround()の動作を指定する:

7.12.9.6 [...]浮動小数点形式の最も近い整数値への引数ラウンドのラウンド関数、離れ半ケースを丸め は、現在の丸め方向にかかわらずゼロです。

round()によって使用される特定の丸めモードは、タイの場合は、ゼロから丸められる意味roundTiesToAwayとしてIEEE 754(2008)浮動小数点規格のセクション4.3.1 に記載されています。しかし、通常のバインディングFE_TONEARESTはIEEE-754(2008)の丸めモードroundTiesToEvenであり、このようなタイケースは偶数の整数になります。実際には、これはの実装はFE_TONEARESTです。このサポートを使用した数多くのシステムプラットフォームのいずれかで遭遇したのはfesetround()です。round()を使用する場合(大きさ)、次に大きい整数(1)に0.5ラウンド、それはさえに丸め:

「最も近い」丸めのこれら二つの変異体の取り扱いの差アスカーの例で明らかですnearbyint()またはrint()が使用されるとき整数(0)。

関連する問題