为什么-fast数学选项打破了我的bool条件
why -ffast-math option break my bool condition
这是导致问题的程序的关键部分,并且程序是完全连续的。
exist_
是bool
类私有成员,dbl_num_
是double
类私有成员
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;
有了选项-fast数学,我得到了打印输出"0 0 5"
没有选项-fast maths,我得到了打印输出的"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;
通过选项-fast数学,我得到了"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;
通过选项-fast数学,我得到了"0 0-5"
我知道-fast数学违反了IEEE标准,它不检查NAN,但它违反上述简单条件检查的确切原因是什么?
-fast math指示g++假设NaN从未发生。因此,将某个东西设置为NaN大致相当于未定义的行为,因为编译器可以安全地假设它从未发生过。请参阅这一系列LLVM博客文章,了解编译器如何消除它"知道"无法执行的分支,以及这是如何令人惊讶的。
简短的版本:g++说:"我们处于快速数学模式,所以dbl_num_从未设置为NaN,所以else分支从未被采用,所以exist_必须为true,所以我可以优化除该路径之外的所有内容"。
编辑:另请参阅此gcc错误报告。
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 我的字符计数代码计算错误.为什么
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- cmake在我的项目中所需的所有静态库都不成功
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 为什么我的for循环不能正确获取argv
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 0-1背包代码中的错误.我的代码中有什么错误
- 当我的阵列太大时出现分段错误
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 学习C,我的编译器已经知道bool(Visual Studio 2017)
- 我可以在没有静音的线程中读取线程中的bool变量
- 我的bool函数一直返回true,我不知道为什么
- 隐式操作员bool()没有回应我的电话
- 我的代码试图找到 0 - n 个数字之间的所有素数,语句"bool prime[n + 1];"中的'+ 1'有什么用?
- 为什么-fast数学选项打破了我的bool条件
- 我如何从不是我的"bool HelloWorld::init()"的方法"this->addChild(sprite)"
- 为什么我的mousehook内dll无法识别简单BOOL