Ошибка округления с плавающей запятой

Я не понимаю вывод следующей программы:

int main()
{
    float  x     = 14.567729f;
    float  sqr   = x * x;
    float  diff1 = sqr - x * x;
    double diff2 = double(sqr) - double(x) * double(x);
    std::cout << diff1 << std::endl;
    std::cout << diff2 << std::endl;
    return 0;
}

Вывод:

6.63225e-006
6.63225e-006

Я использую компилятор VS2010, x86.

Я ожидаю получить другой вывод

0
6.63225e-006

Почему diff1 не равно 0? Для вычисления sqr - x * x компилятор увеличивает точность чисел с плавающей запятой до удвоения. Почему?

5
задан mskfisher 10 May 2012 в 17:16
поделиться