Как-то написал я прогу на чистом хорошем ANSI C. Работала она себе спокойно под OS/2 и Win32. Решил недавно скомпилить ее под Linux и FreeBSD. Все нормально скомпилировалось, но с мат.операциями что-то плохо. Например, выражение ((31.6 - 8.2)/0.2) в проге, скомпилированной в OS/2 или винде, дает ровно 117.000000000000000 (переменные double), тоже самое в Linux и FreeBSD дает что-то вроде 116.999999999999986. Разница может и не большая, но имеет для меня принципиальное значение.
Я сделал тестовую прогу, что-то вроде
int main(void) { double tmp1, tmp2, tmp3;
tmp1 = 31.6; tmp2 = 8.2; tmp3 = 0.2;
printf("%3.15а \n", ((tmp1 - tmp2)/tmp3)); return 0; }
и она выдает в Linux и FreeBSD ровно 117.000000000000000! Т.е. если такой кусок кода выделить в чистом виде, то все работает нормально.
Вопрос: почему такое может быть? Почему в основной программе округляется плохо?
P.S. Пробовал ключи оптимизации - результаты те же. Использовался gcc 3.2.1