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の辞典にでも当たりたいところだ.