所以我在这里遇到了这个奇怪的问题,我不知道该怎么办。
因此,在下面,我将发布我的代码摘录:
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.0
?sideLength + 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
写了一个愚蠢的错误:我认为负零不等于正零,而在正确阅读所有内容后-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。