Sid*_*Bob 8 c++ floating-point intel
英特尔C++编译器提供了两个用于控制浮点的选项:
-fp-speculation(快速/安全/严格/关闭)-fp-model(精确/快速/严格和源/双/扩展)
我想我明白了fp模型的作用.但是什么是fp-speculation以及它与fp模型有什么关系?我还没有找到解释这个的任何英特尔文档!
Ste*_*non 13
-fp-model影响如何浮点计算被执行,并且可以改变数字结果(通过许可不安全优化或通过改变在该中间结果进行评估的精度).
-fp-speculation不会更改数值结果,但可以影响操作引发的浮点标记(或者如果启用了浮点陷阱,则会产生陷阱).99.99%的程序员不需要关心这些事情,所以你可以运行默认值而不用担心它.
这是一个具体的例子; 假设您具有以下功能:
double foo(double x) {
// lots of computation
if (x >= 0) return sqrt(x);
else return x;
}
Run Code Online (Sandbox Code Playgroud)
sqrt相对而言,是缓慢的.提升这样的计算会很好sqrt(x):
double foo(double x) {
const double sqrtx = sqrt(x);
// lots of computation
if (x >= 0) return sqrtx;
else return x;
}
Run Code Online (Sandbox Code Playgroud)
通过这样做,我们允许计算sqrt与其他计算同时进行,减少了我们函数的延迟.但是,有一个问题; if x为负数,然后sqrt(x)引发无效标志.在原始程序中,这可能永远不会发生,因为sqrt(x)只有x在非负数时才计算.在修改的程序中,sqrt(x)无条件地计算.因此,如果x是否定的,则修改的程序会引发无效标记,而原始程序则不会.
该-fp-speculation标志为您提供了一种方法来告诉编译器您是否关心这些情况,因此它知道它是否被许可进行此类转换.