【发布时间】:2016-03-07 12:56:13
【问题描述】:
这是导致问题的程序的关键部分,程序是完全顺序的。
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;
使用选项 -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,但它破坏上述简单条件检查的具体原因是什么?
【问题讨论】:
-
exist_是什么?exist是什么?请发布MCVE。无法复制。 -
如果你想要 NaN,不要使用 -ffast-math。除其他外,编译器特别假设 NaN 不会在该标志打开时发生。
-
@user2357112 那么幕后究竟发生了什么?
-
@BryanFok - 为什么不使用 -S 选项编译并查看生成的程序集? 也许更好(更简单) - 将代码扔到gcc.godbolt.org 看看它要说什么(它显示生成的 asm 与输入的 c/c++ 代码并排显示)
-
@enhzflep 谢谢,这是一个非常酷的工具!但我无法使用简化的代码复制它。但我肯定会更多地使用它。