プログラミング かけ算で妙な現象

今日、仕事でSchemeを使ってたら、ときどき掛け算でおかしなことが起きました。
0.95を掛けたとき、おかしなことが頻発しました。

MIT Schemeでの実行結果をキャプチャーしました。

f:id:nibosiiwasi:20161024220842p:plain

実行結果は、MIT SchemeGaucheも一緒です。どう考えても、こんな結果になるのはおかしいと思うのですが。

(map (lambda (x) (* x 0.95)) '(1 2 3 4 5 6 7 8 9))

=> (0.95 1.9 2.8499999999999996 3.8 4.75 5.699999999999999 6.6499999999999995 7.6 8.549999999999999)

(map (lambda (x) (* x 0.95)) '(.1 .2 .3 .4 .5 .6 .7 .8 .9))
=> (0.095 0.19 0.285 0.38 0.475 0.57 0.6649999999999999 0.76 0.855)


ちなみに、同じ計算をC言語で素朴に書くと、まともな答えが返ってきます(結果は省略)。

どうしてSchemeでは、このような結果が返ってくる???


追記 2016年10月25日21:36

コメント欄もご参照下さい。

Cでもprintfの表示桁数を増やすと、Schemeのときと同様の現象が起きました。