2010-07-26
使用する・しないに関わらず,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 に変更すると,この問題は発生しないもよう.