鍋あり谷あり

テーマを決めずに適当に書いています。

私の知らない浮動小数点

先日の f(f(x)) == -x で気づいたことなんだが。
numeric_limits::min() というか DBL_MIN って、double で表現できる、最も小さな正の値ではないらしい。
その証拠に:

for( double d = numeric_limits<double>::min() ; d!=0 ; d/=2 ){
  cout << d << endl;
}

とかいう計算をすると、2.22507e-308 から 4.94066e-324 まで 53個ほどの数字が出る。
逆に。
最大値の方は numeric_limits::max() で間違いないようで、

cout << numeric_limits<double>::max()*2 << endl;

とやると、一発で無限になる。
いずれも マイクロソフトコンパイラgcc の両者で試した。同じ結果だった。

まあ理屈はわからないでもないと言いたいところだが、やっぱりちゃんとはわかってない。

あと。それとは関係のない話だけど。
numeric_limits::min() の min と、numeric_limits::min() の min って、全然意味が違うんだから別の名前を付けた方がいいと思う。
例えば:
int の min_value は INT_MIN で、int の positive_min は 1。
double の min_value は -DBL_MAX で、double の positive_min は DBL_MIN。
という具合に。

#写真と本文は関係ありません。