正如在这个问题中所说,浮点数的负零和正零之间存在一些差异。我知道这是因为一些重要的原因。我想知道的是避免输出负零的短代码。
例如在以下代码中:
cout << fixed << setprecision(3);
cout << (-0.0001) << endl;
打印“-0.000”。但我想要“0.000”。
请注意,所有其他负数(例如 -0.001)仍应在其前面打印减号,因此根本* -1
不起作用。
正如在这个问题中所说,浮点数的负零和正零之间存在一些差异。我知道这是因为一些重要的原因。我想知道的是避免输出负零的短代码。
例如在以下代码中:
cout << fixed << setprecision(3);
cout << (-0.0001) << endl;
打印“-0.000”。但我想要“0.000”。
请注意,所有其他负数(例如 -0.001)仍应在其前面打印减号,因此根本* -1
不起作用。
试试看你的精度。
cout << ((abs(ans) < 0.0005)? 0.000: ans) << endl;
怎么样:
cout << (value == 0.0 ? abs(value) : value) << endl;
如果您关心任意精度,而不是只关心 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;
}
}