所以我在这里遇到这个奇怪的问题而且我不知道该怎么做。
所以在下面我发布了我的代码的摘录:
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
所以我的问题是,为什么我没有得到真实的?
答案 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。