2007-08-24

为什么x==y而cos(x) != cos(y)

代码:
#include <cmath>


void foo(double x, double y)
{
    double x1 = cos(x);
    double y1 = cos(y);

    if (cos(x) != cos(y))
    {
        std::cout << "Huh?!?\n";
    }
    if (x1 != y1)
    {
        std::cout << "HeiHei!!!!!\n";
    }
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    double x = 1.0;
    double y = 1.0;
    if (x == y)
    {
        std::cout << "!@#!@#!@#\n";
    }
    foo(1.0, 1.0);
    return 0;
}

解释:
对于常见的intel CPU,浮点寄存器的精度比double高。

所以,实际上,比较时到底相不相等,取决于浮点数存放在哪里。
如果都在寄存器或者都在内存中,都会一样;如果有个在寄存器,有个在内存,则很容易不相等。

这个跟编译器有点关系,但是跟CPU硬件关系更大,这就是为什么liuwenshu在他便携上ubuntn下用gcc编译了结果与windows一样的原因。

你还可以试试,debug和release版运行结果都是不一样的,我想这可能是6楼 ilcs 说结果跟lz不一样的原因。

No comments: