2016-01-19 20 views
6

浮動小数点数に対していくつかの演算が実行されているプログラムを書いています。私はプログラムをデバッグした後、特定のテストケースについて、variable equals -2.38418579e-07の値を知りました。今私は小数点以下2桁に設定されたcoutの精度があります。だから私はそれを印刷すると、それを-0.00として印刷します。C++で-0を取り除く方法

しかし、出力を-0.00ではなく0.00にしたいと思います。私は変数の値にさまざまな条件を試しました。しかし、彼らは役に立たない。誰もC++で-0.00を取り除く方法を提案することができます

+0

'のstd :: signbit'が役立つはずです。 – Florian

+3

ちょうどそれを丸めるのはなぜですか? –

+5

出力のチェックはどうなるのですか? '出力(出力==" -0.00 ")出力=" 0.00 ";'(出力はstd :: stringと仮定します) –

答えて

3

まず、許容値をしきい値として定義する必要があります。ここで、このしきい値以下の浮動小数点数の絶対値は0と見なされます。そして、あなたは「フィルタ」あなたの浮動小数点数に構築し、次を使用することができ

#define zero 1e-6 

:たとえば、あなたは、このしきい値を定義することができます私はSFINAEを使用

template<typename T> 
std::enable_if_t<std::is_floating_point<T>::value, T> sanitize(T &&num) { 
    return std::abs(num) < zero? T{} : num;  
} 

Live Demo

お知らせsanitize関数が入力として浮動小数点数のみを受け入れるようにします。

+3

&& refはなぜですか? –

0

私は出力が0.00の代わりに、-0.00

になりたい私はより良い他の回答が好き。しかし、あなたは常にブルートフォースを使用することができますクランチで...(あなたが実際の結果を無視することができます確信している?)

std::string rslt; 
{ 
    std::stringstream ss; 
    ss << variable; // use same formatting as in your example 

    size_t minusSignIndx = ss.str().find("-0.00"); 

    if (minusSignIndx != std::string::npos) 
     rslt = " 0.00"; // found the nasty, ignore it 
    else 
     rslt = ss.str(); // not nasty, use it 
} 
//... use rslt 
+0

なぜ、 'if(ss.str()==" -0.00 ")の代わりに' find'を使ったのかを説明できますか? –

+0

@ M.M - no。最小の思考が関与していた。比較には利点があります。 –

0

問題は[低い、-0.0]一定の間隔でそのすべての浮動小数点であるだろう「-0.00」と印刷する。

したがって、あなたが低い見つける必要がある:

  • ように印刷(前身(低))=> "-0.01"
  • ように印刷(低)=> "-0.00"

その後、あなたは(...離れナン)のようなものを書くことができるようになります

double filter(double x) { 
    double low = ... ; 
    return (x < low) 
     ? x 
     : ((x > 0.0) 
      ? x 
      : 0.0) ; 
} 

あなたは正しく丸められprintf関数を持って、そして管理する場合あなたの計算は厳密にIEEE754が適切なコンパイラフラグに準拠するため、lowの正確な値は-1/200に最も近い倍数で-1/200より大きくなります(私は-0.005ではなく1/200を書きます。二重の値ではなく小数点以下の桁数)

sscanf( " - 0.005"、 "%lf"、d)は正しく丸められています。

[-0.005 < (-1/200) and: [-0.005 successor > (-1/200)]] assert. 

その後継は(必ずしも、上記のチェックがちょうどフールプルーフれる)-1/200よりも大きい:私はファロSmalltalkの言語に見出さ例えばような正確な演算とすることを確認しました。

したがって、あなたが書くことができます(低< =気づく):

double filter(double x) { 
    double low = 0.005 ; 
    return (x <= low) 
     ? x 
     : ((x > 0.0) 
      ? x 
      : 0.0) ; 
} 
関連する問題