カテゴリー
未分類

丸め誤差

僕が初めて一生懸命にプログラミングをはじめたいまから12年ぐらい前、大学を卒業した直後のこと
コンピューターとはこういうモノかとつくづく思った(3日ぐらい悩んで解決できた末に)事を書いてみたいと思います
わざわざ書いてみるようなことでもないような気もするんだけど
それはやっぱり今となっては言えることで
生まれながらにして丸め誤差に悩まされずにコンピューターをこき使える人類が発生することは当分ないと思うので書いておこう

プログラムなんか全然やらない人もプログラムする人たちはこんなことに煩わされたりするんだなー
なんてことを知ってもらえると嬉しいです

前置きが長くなりました

当時、どんな問題を考えていたかというと
あるひとつの場所から無数の玉を壁に向かって発射して、それがどんな風に跳ね返るか計算する、というのをやってました
何のためにこんなことをやっていたかは長くなるのでやめます

で、これを解くための過程として
平面と直線の交点を求めるということが必要になってくる
この交点が発射した玉が壁にぶつかる位置ということで

実際にこれからこれをやってみてもいいんだけどだいぶ面倒なので全部やめて
これを計算してみて欲しい

0.14 × 9

馬鹿にしてると思わないでね、これは当然 1.26

じゃあ同じ計算をこのブラウザさんに載っているjavascriptというプログラム言語さんにやってもらいましょう

× =

どうでした?

javascriptのバカ!とかいわないでね。彼もいろいろなものを背負って生きてるんだから。

こうなるわけは簡単に言うと彼らは内部では数字を2進数で扱っているということと無理数は扱えない(扱える数の大きさ、小ささに限界がある)ということからこんなことになります

このような誤差のせいで壁にぶつかってるはずの玉がぶつかってないと判断されるということが起きて僕は途方にくれました
手の計算じゃ確かにぶつかっているのになんでだーって悩んだんでした

数学の中だと無理数とか無限小とか無限大とか、点とか線は面積は持たないとか観念としておもいついちゃえば立派にあることになって楽しいことがいろいろできるんだけどこっちの世界に持って来ちゃうとそうは問屋が卸さない(この言い方もそろそろ死語か?)

この問題にぶち当たるまではコンピューターの中は十分あちら側だと思っていたのにそんなことなかった
彼らも僕たちと同じ有限の時間(いっぱい玉打ち出すと計算にかなり時間かかるし)と空間しかもってないんだなーと思って仲間意識が芽生えたようないっぽうで何だそんなもんかってちょっとがっかりしたり

そんな体験でした