Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 什么样的优化包含在安全数学优化中?_C_Gcc_Optimization_Floating Point - Fatal编程技术网

C 什么样的优化包含在安全数学优化中?

C 什么样的优化包含在安全数学优化中?,c,gcc,optimization,floating-point,C,Gcc,Optimization,Floating Point,GCC声明,-funsafe数学优化允许优化“(a)假设参数和结果有效,(b)可能违反IEEE或ANSI标准”,但这不是很精确,是吗 在这种情况下,“无效”参数可能是什么?南斯?无限?低于正常值?负数到sqrt() 允许结果偏离IEEE或ANSI标准的程度有多大?它是“仅仅”像这样的东西,还是可能包括,例如,与NaN的真实比较或与无限的不正确比较?存储的变量在已经使用后是否可以重新取整(这样,对于变量x和y,(x==y)+(x==y)可以计算为1)?isinf()/isnan()能停止工作吗 G

GCC声明,
-funsafe数学优化
允许优化“(a)假设参数和结果有效,(b)可能违反IEEE或ANSI标准”,但这不是很精确,是吗

在这种情况下,“无效”参数可能是什么?南斯?无限?低于正常值?负数到
sqrt()

允许结果偏离IEEE或ANSI标准的程度有多大?它是“仅仅”像这样的东西,还是可能包括,例如,与NaN的真实比较或与无限的不正确比较?存储的变量在已经使用后是否可以重新取整(这样,对于变量
x
y
(x==y)+(x==y)
可以计算为1)?
isinf()
/
isnan()
能停止工作吗

GCC开发人员是否遵循与此类问题相关的任何特定系统或规程,或者答案是否会因版本而异?

根据(mybold):

此模式启用允许任意重新关联的优化转换,而不保证准确性。它也不会试图保留零的符号


这包括您提到的,以及“内置函数[其]的名称,如uuu builtin_sqrt”,当它们“可能精度较低或被限制在较小的域内”时应用这些函数。

据我所知,这与此无关<代码>-ffinite math only和
-ffast math
尽管如此。也许这只是实现和/或文档中的一个缺陷,但现实似乎与您描述的不匹配,因为我观察到GCC只优化了
楼层()
在启用
-funsafe math optimization
时调用
roundsd
指令,即使该指令不能合理地违反您描述的约束条件,也可以看出该单个指令也是SSE4.1+处理器glibc中
floor()
函数的实现。我必须调查。显然,
roundsd
优化只在
-fno-trapping math
中启用,这是
-funsafe math优化的一部分。据GCC邮件列表上的人说,无论如何,这一限制似乎过于谨慎,因此似乎没有理由认为这意味着比这个答案所表明的安全性更低。清理完毕后,我将其标记为已接受。