浮動小数点型変数は必ず初期化する

使用する・しないに関わらず,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:簡略化したコードでこの問題の再現を試みたが,うまく行かなかった.