«前の日記(2007年12月05日) 最新 次の日記(2007年12月07日)» 編集

日々をアレコレ


2007年12月06日

非数と無限大

浮動小数点に非数という概念があることを初めて知る。0で割った演算結果が該当する。単精度(float)ならば指数部8ビットがすべてONかつ仮数部が非ゼロならば、非数という扱いになるとのこと。もし、仮数部が0ならば無限大を表すことになるらしい。

で、今日のバグ。その非数の計算をしている箇所が、コンパイル時に最適化をするとおかしな値を返している模様。計算方法は次の通り。

double calcNan()
{
    float ret;
    *((DWORD*)&ret) = 0x7fc00000;
    return ret;
}

floatで確保したretのポインタに0x7fc00000を代入して、retを非数としているという感じ。で、retの宣言時にvolatileをするとエラーは起きない。なんで?


«前の日記(2007年12月05日) 最新 次の日記(2007年12月07日)» 編集