GCC的man page表明-funsafe-math-optimizations
允许优化“(a)假设参数和结果有效,(b)可能违反IEEE或ANSI标准”,但这不是很精确,它?
在这种情况下,“无效”的论点是什么? NaN的? Infinites?次归? sqrt()
的负数?
结果允许偏离IEEE或ANSI标准多远?它是“仅仅”像operation associativity and ordering这样的东西,还是可能包括例如。与NaN的真实比较或与无限的不正确比较?存储的变量是否可以在使用后重新舍入(对于变量 x
和y
,(x == y) + (x == y)
可以评估为1)? isinf()
/ isnan()
可以停止工作吗?
GCC开发人员是否遵循任何特定的系统或纪律来解决这些问题,或者答案在不同版本之间的差异很大?
答案 0 :(得分:3)
根据gcc.gnu.org(我的粗体):
此模式允许进行优化,允许任意重新关联和转换而无需准确性保证。它也不会尝试保留零的符号。
这包括您提及的associative reordering,以及"内置函数[其]具有名称,例如__builtin_sqrt" 在时应用"可能精度较低或仅限于较小的域"