负零不等于正零

时间:2018-01-01 20:37:27

标签: c

所以我在这里遇到这个奇怪的问题而且我不知道该怎么做。

所以在下面我发布了我的代码的摘录:

printf("%lf , %lf \n", cGrid_Y,sideLength);

printf("%lf <= %lf\n", Point_Y, cGrid_Y+sideLength);

bool x = (Point_Y <= (sideLength + cGrid_Y) );
printf("%s \n", x ? "true" : "false");

cGrid_Y和sideLength是双打。我得到了这个输出:

-12.800000 , 12.800000 
0.000000 <= -0.000000
false 

所以我的问题是,为什么我没有得到真实的?

3 个答案:

答案 0 :(得分:6)

这不是负零的问题。 0.0 <= -0.0是真的。问题在于,当您要求printf将其显示为小数点后6位时,您的值实际上不是零或负零,而是一些非常小的值,它会被舍入为0以进行显示。使用%e%g(使用指数表示法显示更好的近似值)打印,或%.1100f打印,其精度足以显示任何double的确切值。< / p>

答案 1 :(得分:2)

  

所以我的问题是,为什么我没有得到真的?

您确定Point_Y == 0.0吗? sideLength + cGrid_Y的总和相同? 检查你的假设:

printf("Point_Y is zero: %d\n", Point_Y == 0.0);
printf("`sideLength + cGrid_Y` is zero: %d\n", (sideLength + cGrid_Y) == 0.0);

你感到困惑的原因是因为默认情况下printf&#39; floats/doubles are't printed to full precision

#include <stdio.h>

int main()
{
  double x = 0.0000001;
  printf("x: %f\n", x);
}

输出:x: 0.000000

答案 2 :(得分:0)

@edit我写了一个愚蠢的错误:我认为负零不等于正零,而在读完之后所有正确-0等于+0。

问题的根源:你正试图测试两个双打是否相等,这是一个可怕的想法,因为浮点表示不精确。请注意常见示例:0.1 + 0.2不等于0.3:

Is floating point math broken?

https://www.quora.com/Why-is-0-1+0-2-not-equal-to-0-3-in-most-programming-languages

由于此数字存储在计算机内存中的基本特性,您不能在不丢失部分信息的情况下以二进制形式表示12.8。

同样地,你不能在数字位数有限的数字的“正常”十进制表示中代表1/7。