英特尔 C++ 编译器提供了两个控制浮点的选项:
-fp-推测(快速/安全/严格/关闭) -fp-模型(精确/快速/严格和源/双/扩展)
我想我明白 fp-model 的作用。但什么是 fp 推测以及它与 fp 模型有何关系?我还没有找到任何解释这一点的英特尔文档!
-fp-model
影响如何进行浮点计算,并且可以改变数值结果(通过许可不安全的优化或改变评估中间结果的精度)。
-fp-speculation
不会更改数值结果,但可以影响操作引发的浮点标志(或者在启用浮点陷阱的情况下采取哪些陷阱)。 99.99% 的程序员不需要关心这些事情,所以你可能可以使用默认值运行而不用担心。
这是一个具体的例子;假设你有以下功能:
double foo(double x) {
// lots of computation
if (x >= 0) return sqrt(x);
else return x;
}
相对而言,sqrt
很慢。像这样提升sqrt(x)
的计算会很好:
double foo(double x) {
const double sqrtx = sqrt(x);
// lots of computation
if (x >= 0) return sqrtx;
else return x;
}
通过这样做,我们允许
sqrt
的计算与其他计算同时进行,从而减少了函数的延迟。然而,有一个问题;如果 x
为负,则 sqrt(x)
会引发无效标志。在原始程序中,这种情况永远不会发生,因为仅当 sqrt(x)
为非负时才计算 x
。在修改后的程序中,sqrt(x)
是无条件计算的。因此,如果 x
为负,则修改后的程序会引发无效标志,而原始程序则不会。
-fp-speculation
标志为您提供了一种方法来告诉编译器您是否关心这些情况,因此它知道它是否被许可进行此类转换。
乱序执行和推测执行可能会导致无关的异常或在错误的时间引发异常。
如果这对您很重要,您可以使用
fp-speculation
选项来控制浮点指令的推测。
在 Windows 操作系统上: 1.Intel编译器浮点计算32位应用程序与64位应用程序,相同的代码可以给你不同的结果!!!!无论您选择什么标志:)!!!!
2.Visual Studio编译器浮点计算32位与64位应用程序,相同的代码输出相同的结果。