gpt4 book ai didi

c++ - 为什么 -ffast-math 选项打破了我的 bool 条件

转载 作者:搜寻专家 更新时间:2023-10-31 01:37:31 25 4
gpt4 key购买 nike

这是导致问题的程序的关键部分,程序是完全顺序的。

exist_ 是类bool 的私有(private)成员,dbl_num_ 是类double 的私有(private)成员

exist_ = false;
dbl_num_ = 0;
std::cout << dbl_num_ << " " ;
if(exist_ == true)
{
dbl_num_ = 5;
}else
{
dbl_num_ = NAN;
}

std::cout << exist_ << " " << dbl_num_ << std::endl;

使用选项 -ffast-math,我得到打印输出“0 0 5”

没有选项 -ffast-math,我得到打印输出“0 0 NAN”

此外,如果我将程序更改为

exist_ = false;
dbl_num_ = 0;
std::cout << dbl_num_ << " " ;
if(exist_ == true)
{
std::cout << exist_ << " " ;
dbl_num_ = 5;
}else
{
dbl_num_ = NAN;
}

std::cout << exist_ << " " << dbl_num_ << std::endl;

使用选项 -ffast-math,我得到“0 0 NAN”

然后我将 NAN 更改为 -5

exist_ = false;
dbl_num_ = 0;
std::cout << dbl_num_ << " " ;
if(exist_ == true)
{
dbl_num_ = 5;
}else
{
dbl_num_ = -5;
}

std::cout << exist_ << " " << dbl_num_ << std::endl;

使用选项 -ffast-math,我得到“0 0 -5”

我知道 -ffast-math 破坏了 IEEE 标准,它不检查 NAN,但它破坏上述简单条件检查的确切原因是什么?

最佳答案

-ffast-math 指示 g++ 假设 NaN 永远不会发生。那么,将某些内容设置为 NaN 大致等同于未定义的行为,因为编译器可以安全地假设它永远不会发生。参见 this LLVM 系列博客文章,了解有关编译器如何消除它“知道”无法执行的分支的信息,以及这如何令人惊讶。

简短版本:g++ 运行“我们处于快速数学模式,所以 dbl_num_ 永远不会设置为 NaN,所以永远不会采用 else 分支,所以 exist_ 必须为真,所以我可以优化除该路径之外的所有内容".

编辑:另见 this gcc 错误报告。

关于c++ - 为什么 -ffast-math 选项打破了我的 bool 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34057052/

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