C++ 避免输出负零的最佳方法是什么?
正如所讨论的,浮点数中的负零和正零之间存在一些差异。我知道这是因为一些重要的原因。我想知道的是一个简短的代码,以避免输出中出现负零 例如,在以下代码中:C++ 避免输出负零的最佳方法是什么?,c++,floating-point,cout,C++,Floating Point,Cout,正如所讨论的,浮点数中的负零和正零之间存在一些差异。我知道这是因为一些重要的原因。我想知道的是一个简短的代码,以避免输出中出现负零 例如,在以下代码中: cout << fixed << setprecision(3); cout << (-0.0001) << endl; cout根据您的精度进行尝试 cout怎么样: cout << (value == 0.0 ? abs(value) : value) << end
cout << fixed << setprecision(3);
cout << (-0.0001) << endl;
cout根据您的精度进行尝试
cout怎么样:
cout << (value == 0.0 ? abs(value) : value) << endl;
cout如果您关心任意精度,而不是3的固定精度,那么您需要做一点工作。基本上,你必须在考试前做一个预检查,看看数字是否会以你不喜欢的方式格式化
您需要找到数字的数量级,以查看不精确的数字是否会丢失,只留下符号位
可以使用数字绝对值的以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;
}
}
float-iHateNegativeZeros(float-theFloat,int-precision)
{
如果((气流<0.0f)&&
(-log10(abs(theFloat))>精度)
{
归还赃物;
}
其他的
{
归还赃物;
}
}
@TonyTheLion如果我的号码是-0.001怎么办?它应该被打印成-0.001,我不应该*-1。一个负数乘以另一个负数得到一个正数。这是基础数学。你的意思是什么?在你做*-1之前,你必须检查你的数字不是正数,否则你会得到一个负数作为输出。@TonyTheLion我应该只在结果为-0.000时乘以-1。并不是所有的负数,正如你所说的“在你做*-1之前,你必须检查你的数字不是正数”。你似乎在谈论两件不同的事情:负零,和一个足够小的负数,它在打印时会舍入到零,所以有一些特定的精度。你想阻止什么?应该是:'couth-Walyk:不能从C++中的条件表达式返回不同类型。@ Walyk不需要。因为在此之前调用了setprecision(3)。@nneonno:哦,是的。最近我做了太多的javascript和php。@阿拉丁:网上有很多资源解释为什么value==0.0
是个坏主意。如果提问者真的只想抓住否定的0,那么这个答案是正确的(也是一个好主意)。但问题的主体表明情况并非如此。@IronMensan-从那篇文章中得到的是“IEEE标准定义了比较,因此+0=-0”…所以我真的很感兴趣-你能给我指出一些更明确地解释这个问题的东西吗?史蒂夫·杰索普——在我看来,这个问题的主体只是关于负0的。我遗漏了什么吗?是的,问题主体说提问者希望打印“0.000”
,而不是“-0.000”
的值-0.0001
。所以需要特别处理的不仅仅是负零,-0.0001
。基本上,提问者将来自cout
的“-0.000”
的任何输出称为“负零”,而不仅仅是指值中的IEEE负零。