3.5E+1 和 35 是在存储形式上的不相等。可以通过下面这个不完全测试来发现:
/* our test function */
int compare_test(double a, int b)
{
int flag = 0;
char p_1[8] = {0};
char p_2[8] = {0};
/* we compare a and b with memcpy */
memcpy(p_1, (const char *)(&a), 8);
memcpy(p_2, (const char *)(&b), 8);
if (memcmp(p_1, p_2, 8) == 0)
{
flag = 1;
}
else
{
flag = 0;
}
return flag;
}
void main()
{
int ret = 0;
double a = 3.5E+1;
int b = 35;
/* test our target */
ret = compare_test(a, b);
if (ret != 0)
{
printf("a and b are equal\n");
}
else
{
printf("a and b is not equal\n");
}
return 0;
}
程序执行后返回:
a and b is not equal
上面的测试基于这一假设:如果两个变量的数值相等,那么他们在内存中的表现形式也应该完全相同。这个假设可以通过反证法来证明其必为真。
如果使用 if (a == b) 直接把 3.5E+1 和 35 进行比较,编译器会把 35 先转换为浮点型的35.0,然后和3.5E+1进行比较,而此时,两者恰好相等,所以这个时候表象上的相等掩盖了事实上的不相等。
BTW: 一般说来,对于浮点数不应该使用 == 符号来测试其是否相等,而应使用 <= 或 >= 来测试,原因诸多书上都有讲到(推荐参看林锐博士的《高质量C++/C编程指南》)。
[[it] 本帖最后由 prankmoon 于 2009-7-21 05:02 编辑 [/it]]