浮動小数点型変数は必ず初期化する
使用する・しないに関わらず,float, double, long double 型の変数は必ず初期化するポリシーで生きることにする.
long double の変数を初期化せずにテキストに保存すると,予期しない文字コードが含まれた (std::setprecision などの書式を使っていた)*1.
であることを肝に命じる.
サンプルコード:
#include <iostream> #include <sstream> using namespace std; std::string float_to_str (const long double &val) { stringstream ss; ss<< val; return ss.str(); } int main(int argc, char**argv) { long double t; cout<<float_to_str(t)<<endl; cout<<(t>=1.0l?"true":"false")<<endl; cout<<(t<=1.0l?"true":"false")<<endl; return 0; }
これを g++ (Debian 4.4.2-4) でコンパイルし,実行すると,
-1.24287e+2453 false false
という結果を返す(環境依存性が強いと思われる).
t が「ランダムな浮動小数」なら,二つの真理値は必ず (false,true) か (true,false) の組合せになることに注意.
なお,long double を double に変更すると,この問題は発生しないもよう.
*1:簡略化したコードでこの問題の再現を試みたが,うまく行かなかった.