Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 避免输出负零的最佳方法是什么?_C++_Floating Point_Cout - Fatal编程技术网

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负零。