12

この質問で述べられているように、浮動小数点数の負のゼロと正のゼロの間にはいくつかの違いがあります。私はそれがいくつかの重要な理由のためであることを知っています。私が知りたいのは、出力の負のゼロを回避するための短いコードです。

たとえば、次のコードで:

cout << fixed << setprecision(3);
cout << (-0.0001) << endl;

「-0.000」が出力されます。でも「0.000」が欲しいです。

他のすべての負の数(たとえば、-0.001)は、マイナス記号を前に付けて印刷する必要があるため、単純* -1に機能しないことに注意してください。

4

3 に答える 3

3

どうですか:

cout << (value == 0.0 ? abs(value) : value)  << endl;
于 2012-09-21T19:18:32.510 に答える
3

精度に応じて試してください。

cout << ((abs(ans) < 0.0005)? 0.000: ans) << endl;

于 2012-09-21T18:51:39.647 に答える
1

3 の固定精度ではなく、任意の精度を気にする場合は、少し作業が必要になります。基本的に、cout の前に事前チェックを行って、数値が望ましくない方法でフォーマットされるかどうかを確認する必要があります。

不正確な数字が失われ、符号ビットだけが残るかどうかを確認するには、数値の大きさの順序を見つける必要があります。

これは、数値の絶対値の 10 を底とする対数を使用して行うことができます。結果の負の値が設定した精度よりも大きい場合、数値は望ましくない方法で表示されます。

0.0001 の log10 は -4 です。

(-4) のマイナスは 4 です。

4 > 3 (任意の精度) したがって、値は残念ながら表示されます。

非常に悪い擬似コードで:

float iHateNegativeZeros(float theFloat, int precision)
{
   if((theFloat < 0.0f) &&
      (-log10(abs(theFloat)) > precision))
   {
     return -theFloat;
   }
   else
   {  
     return theFloat;
   }
}
于 2012-09-21T20:32:41.883 に答える