0.1 + ... + 0.1 != 1.0

id:elb_phys:20060126#1138259799 の話.
私も同じ問に答えた.そのときは適当に「0.1より厳密には小さい値として表現されたものと思われる」とか書いておいたが,そうではなかったというのは驚き.
しかし,厳密に考えるには

これの他に,まず

こちらを知らなければならない.ちなみにIEEE 754 singleで言うなら0.1は0xbdcccccdすなわち(1+ 5033165/2^23) * 2^-4として表現されるのが標準的*1らしい.これはMathematicaによれば0.100000001490116119384765625に(厳密に)等しい.
また,うるさいことを言うならprintfデバッグをするときには

これも押えておかないと誤った結論を導きかねない.丸めは2進数で行われている以上,10進出力だけを見て議論するのはちょっとまずそうだよね.
で,そんな訳で深追いはしないのが吉かと.
そもそも小数の基数変換の特徴付けは「有理数として捉えたときに元の10進小数に一番近い浮動小数点数を選ぶ」でいいのかな? Knuthの辞典にでも当たりたいところだ.

*1:gcc 3.3.5でのアセンブラ出力と,Ocamlでの,前エントリで触れたコードによる出力.

*2:私が知っているのには,Gaucheで使われていると噂のBurger-Dybvigのアルゴリズムがある.