gpt4 book ai didi

c++ -/fp :fast 的奇怪结果

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:03:16 24 4
gpt4 key购买 nike

我们有一些看起来像这样的代码:

inline int calc_something(double x) {
if (x > 0.0) {
// do something
return 1;
} else {
// do something else
return 0;
}
}

不幸的是,当使用标志 /fp:fast 时,我们得到 calc_something(0)==1 所以我们显然采用了错误的代码路径。只有当我们在代码中使用不同参数的多个点使用该方法时才会发生这种情况,因此我认为编译器(Microsoft Visual Studio 2008,SP1)在此处进行了一些可疑的优化。

此外,当我们将界面更改为

时,上述问题就消失了
inline int calc_something(const double& x) {

但我不知道为什么这会修复奇怪的行为。谁能解释这种行为?如果我无法理解发生了什么,我们将不得不删除 /fp:fast 开关,但这会使我们的应用程序变慢很多。

最佳答案

我对 FPU 不够熟悉,无法确定地发表评论,但我的猜测是编译器正在让一个它认为应该等于 x 的现有值参与比较.也许你去 y = x + 20.; y = y - 20; y 已经在 FP 堆栈上,因此编译器不会加载 x 而是与 y 进行比较.但由于舍入误差,y 并不完全是 0.0,您会看到奇怪的结果。

为了更好的解释:Why is cos(x) != cos(y) even though x == y?来自 C++FAQ lite。这是我试图传达的内容的一部分,我只是不记得我刚才在哪里读过它。

更改为 const 引用可以解决此问题,因为编译器担心别名。它强制从 x 加载,因为它不能假设它的值在创建 y 之后的某个时刻没有改变,并且由于 x 是实际上正好是 0.0 [这在我熟悉的每种浮点格式中都可以表示],舍入误差消失了。

我很确定 MS 提供了一个 pragma,允许您在每个函数的基础上设置 FP 标志。或者您可以将此例程移至单独的文件并为该文件提供自定义标志。无论哪种方式,它都可以防止您的整个程序仅仅为了让那个例程快乐而受苦。

关于c++ -/fp :fast 的奇怪结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3042925/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com