Dol*_*000 14 c floating-point optimization gcc
GCC的手册页指出-funsafe-math-optimizations
允许优化"(a)假设参数和结果有效,(b)可能违反IEEE或ANSI标准",但这不是很精确,是吗?
在这种情况下,什么可能是"无效"的论点?NaN的?Infinites?次归?负数到sqrt()
?
结果允许偏离IEEE或ANSI标准多远?它是"仅仅"像操作关联性和排序的东西,还是可能包括例如.与NaN的真实比较或与无限的不正确比较?可以存储变量进行重新四舍五入已被使用后(使得对变量 x
和y
,(x == y) + (x == y)
可以评估到1)?可以isinf()
/ isnan()
停止工作吗?
GCC开发人员是否遵循任何特定的系统或纪律来解决这些问题,或者答案在不同版本之间是否会有很大不同?
根据gcc.gnu.org(我的粗体):
此模式可实现允许任意重新关联和转换的优化,但不保证准确性。它也不会尝试保留零的符号。
这包括您提到的关联重新排序,以及“具有诸如 __builtin_sqrt 之类的名称的内置函数”,当它们“可能具有较低的精度或被限制在较小的域”时应用