プログラミング(へたれな)コネタ 0.1の10.0倍は1.0にはならない

カーニハンの「プログラム書法」より
プログラミング汎用のネタですね。VBAでネタに説明

?fix("1.000001"*100000000.00)
100000099
となります。 これななぜか?
2進方式の計算機にでは、(10進法の1/3が有限小数とならないのと同じ理由で)「0.1」は有限小数にならないためである。その一番近い近似表現は、たいがいの計算機において、たまたま0.1より少し小さくなる。だから、「0.1」の10倍は1.0000・・・・ではなく0.999999・・・・であり、その延長として、「0.1」を1.0に90回足したものは、10.000・・・でなくて9.999・・・ になるのである。

2進数で「0.1」が有限小数とならないのは実際に2進表記にしてみるとわかるかも0.000110010・・・ となり有限回でとまらない。
最近はハードウェアの状態は言語で意識しづらいから単純にゆかないことがあるので問題をさらにややこしくしますね。

っえ2進の少数表記がわからないって!(問題外です。)

プログラム書法
プログラム書法
  • 発売元: 共立出版
  • 価格: ¥ 3,150
  • 発売日: 1982/06
  • おすすめ度 4.5