После публикации моего предыдущего поста на эту тему я решил обобщить информацию, которую узнал.
Итак, на главной странице системы багрепортов GCC висит отличное сообщение: "Проблемы с числами с плавающей точкой - самый популярный небаг". Т.е. к этому надо быть готовым и исправлять это они не собираются.
Небаг заключается в некорректном преобразовании оптимизатором плавающих чисел. Точнее, не так, как это делает соппроцессор (иногда, впрочем, угадывает). Как от double к int, так и в обратную сторону.
В частности, код из предыдущего поста (компилировать с -O2) на некоторых версиях и машинах может вывести, что 20971519 == 20971520. Однако, если сделать EPS = 10-8, то лично у меня всё работает.
Ощущение, что оптимизатор что-то где-то всё-таки криво считает (например, во float).
Но всё же это надо учитывать. Я лично изменил свой любимый EPS. Жаль.
Итак, на главной странице системы багрепортов GCC висит отличное сообщение: "Проблемы с числами с плавающей точкой - самый популярный небаг". Т.е. к этому надо быть готовым и исправлять это они не собираются.
Небаг заключается в некорректном преобразовании оптимизатором плавающих чисел. Точнее, не так, как это делает соппроцессор (иногда, впрочем, угадывает). Как от double к int, так и в обратную сторону.
В частности, код из предыдущего поста (компилировать с -O2) на некоторых версиях и машинах может вывести, что 20971519 == 20971520. Однако, если сделать EPS = 10-8, то лично у меня всё работает.
Ощущение, что оптимизатор что-то где-то всё-таки криво считает (например, во float).
Но всё же это надо учитывать. Я лично изменил свой любимый EPS. Жаль.
Только не во float и не в double, а непосредственно в регистрах сопроцессора (которые таки чуть больше, чем double).