これは問題を引き起こすプログラムのクリティカル セクションであり、プログラムは完全にシーケンシャルです。
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をチェックしませんが、上記の単純な条件チェックを破る正確な理由は何ですか?