负零不等于正零

  • 本文关键字:不等于 c
  • 更新时间 :
  • 英文 :


所以我在这里遇到了这个奇怪的问题,我不知道该怎么办。

因此,在下面,我将发布我的代码摘录:

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

cGrid_Y和边长是双精度。我得到这个输出:

-12.800000 , 12.800000 
0.000000 <= -0.000000
false 

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

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

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

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

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

您感到困惑的原因是,默认情况下,printf 的浮点数/双精度数没有以全精度打印。

#include <stdio.h>
int main()
{
  double x = 0.0000001;
  printf("x: %fn", x);
}

输出:x: 0.000000

@edit我

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

问题的根源:您正在尝试测试两个双精度值是否相等,由于浮点表示的不精确性,这是一个糟糕的想法。请注意常见示例:0.1 + 0.2 不等于 0.3:

浮点数学坏了吗?

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

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

同样,您不能在具有有限位数的数字的"正常"十进制表示中表示 1/7。

最新更新