Ниже значения переменных result1 и result2 сообщают разные значения в зависимости от того, компилируете ли вы код с помощью -g или с -O в GCC 4.2.1 и GCC 3.2.0 (и я не пробовал более свежие версии GCC) :
double double_identity(double in_double)
{
return in_double;
}
...
double result1 = ceil(log(32.0) / log(2.0));
std::cout << __FILE__ << ":" << __LINE__ << ":" << "result1==" << result1 << std::endl;
double result2 = ceil(double_identity(log(32.0) / log(2.0)));
std::cout << __FILE__ << ":" << __LINE__ << ":" << "result2==" << result2 << std::endl;
result1 и result2 == 5 только при компиляции с использованием -g, но если вместо этого я компилирую с -O, я получаю result1 == 6 и result2 == 5.
Это похоже на разницу в том, как оптимизация выполняется компилятором, или что-то связанное с представлением с плавающей запятой IEEE внутри, но мне любопытно, как именно возникает эта разница. Я надеюсь, что вообще не буду смотреть на ассемблер.
Вышеупомянутое было скомпилировано на C ++, но я предполагаю, что то же самое было бы, если бы оно было преобразовано в код ANSI-C с помощью printfs.
Вышеуказанное несоответствие наблюдается в 32-битном Linux, но не в 64-битном Linux.
Спасибо bg