-funsafe-math-optimizations 中包含哪些优化?
What kind of optimizations are included in -funsafe-math-optimizations?
GCC 的 man page 声明 -funsafe-math-optimizations
允许优化“(a) 假设参数和结果有效并且 (b) 可能违反 IEEE 或 ANSI 标准”,但这不是很精确,是吗?
在这种情况下,"invalid" 参数是什么? NaNs?无穷大?低于正常值?负数到 sqrt()
?
允许结果偏离 IEEE 或 ANSI 标准多远?它是 "merely" 之类的东西 operation associativity and ordering,还是可能包括例如。与 NaN 的真实比较或与无穷大的不正确比较?存储的变量在使用后是否可以重新舍入(这样,对于 variables x
和 y
,(x == y) + (x == y)
可以计算为 1) ? isinf()
/isnan()
可以停止工作吗?
GCC 开发人员是否遵循关于此类问题的任何特定系统或纪律,或者答案是否会因版本而异?
根据gcc.gnu.org(我的粗体):
This mode enables optimizations that allow arbitrary reassociations and transformations with no accuracy guarantees. It also does not try to preserve the sign of zeros.
这包括您提到的 associative reordering,以及 "Built-in functions [which] have names such as __builtin_sqrt" 在 "may have less precision or be restricted to a smaller domain"
GCC 的 man page 声明 -funsafe-math-optimizations
允许优化“(a) 假设参数和结果有效并且 (b) 可能违反 IEEE 或 ANSI 标准”,但这不是很精确,是吗?
在这种情况下,"invalid" 参数是什么? NaNs?无穷大?低于正常值?负数到 sqrt()
?
允许结果偏离 IEEE 或 ANSI 标准多远?它是 "merely" 之类的东西 operation associativity and ordering,还是可能包括例如。与 NaN 的真实比较或与无穷大的不正确比较?存储的变量在使用后是否可以重新舍入(这样,对于 variables x
和 y
,(x == y) + (x == y)
可以计算为 1) ? isinf()
/isnan()
可以停止工作吗?
GCC 开发人员是否遵循关于此类问题的任何特定系统或纪律,或者答案是否会因版本而异?
根据gcc.gnu.org(我的粗体):
This mode enables optimizations that allow arbitrary reassociations and transformations with no accuracy guarantees. It also does not try to preserve the sign of zeros.
这包括您提到的 associative reordering,以及 "Built-in functions [which] have names such as __builtin_sqrt" 在 "may have less precision or be restricted to a smaller domain"