GCC справочная страница утверждает, что -funsafe-math-optimizations
допускает оптимизацию: "(а) предположить, что аргументы и результаты действительны и (б) могут нарушать стандарты IEEE или ANSI", но это не очень точно, не так ли?
Что может быть "недействительным" аргументом в этом случае? NaNs? Бесконечностей? Subnormals? Отрицательные числа до sqrt()
?
Насколько далеки результаты, позволяющие отклоняться от стандартов IEEE или ANSI? Это "просто", например, ассоциативность и упорядочение операций, или может включать, например. истинные сравнения с NaN или неправильные сравнения с бесконечными? Может ли измененная хранимая переменная быть повторно округлена после того, как она уже используется (для переменных x
и y
, (x == y) + (x == y)
может быть оценено 1)? Не удалось isinf()
/isnan()
работать?
Разрабатывают ли разработчики GCC какую-либо конкретную систему или дисциплину в отношении таких вопросов или может ли ответ сильно отличаться от версии к версии?