什么是避免产出负零的最佳方法?

时间:2012-09-21 18:35:35

标签: c++ floating-point cout

正如在this问题中所说,浮点数中的负零和正零之间存在一些差异。我知道这是因为一些重要的原因。我想知道的是一个短代码,以避免输出中的负零。

例如在以下代码中:

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

“ - 0.000”打印。但我想要“0.000”。

请注意,所有其他负数(例如-0.001)仍应使用前面的减号打印,因此只需* -1即可。

3 个答案:

答案 0 :(得分:3)

根据您的精确度尝试。

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

答案 1 :(得分:3)

怎么样:

cout << (value == 0.0 ? abs(value) : value)  << endl;

答案 2 :(得分:1)

如果你关心任意精度,而不是只有3的固定精度,你需要做一点工作。基本上,你必须在cout之前做一个预先检查,看看这个数字是否会以你不喜欢的方式进行格式化。

你需要找到数字的数量级,看它是否会丢失不精确的数字,只留下符号位。

您可以使用数字绝对值的基数10对数来执行此操作。如果结果的负数大于您设置的精度,则数字将以您不想要的方式显示。

0.0001的log10是-4。

(-4)的负数为4.

4&gt; 3(任意精度) 因此价值将显得不高兴。

非常糟糕的伪代码:

float iHateNegativeZeros(float theFloat, int precision)
{
   if((theFloat < 0.0f) &&
      (-log10(abs(theFloat)) > precision))
   {
     return -theFloat;
   }
   else
   {  
     return theFloat;
   }
}