にいるのだが、実際は内職で原稿を書いている。
やっぱ浮動小数点数なんてテーマを選ぶんじゃなかったなあ、
と公開後悔することしきり。なんか、さんざん苦労して書いたあげく
読者から「間違ってます」なんて指摘を受けるんじゃないかと。
一番苦労するのは、誤差の実例で、 教科書的な例題だとfloatを使って誤差を出しているんだけど、 RubyのFloatは内部的にはdoubleを使っているので
と悩ましい限りだ。
ま、良い例題が見つかってしまえば後は楽ってのは原稿書きの常だけど。 で、いつもうまくいっているわけではないというのが、悩ましい*1。
*1 「いつもうまくいっているわけではない」が「いつもうまくいっていない」か「いつもうまくいっている、というわけではない」のいずれであるかが大問題なのだが....聞かないで。
localeの問題で自前で実装を準備したstrtod(3)だが*1、どうも精度が悪いらしい。プラットフォームによっては有効数字が16桁出ないでmake testでエラーが出るようだ。本来は10進18桁近くあるはずなのにな。
試してみると、その辺に転がっているフリーのstrtod(3)実装は軒並み精度がその程度しかない。見るとPythonは内部でシステムのatod(3)を使っている。Perlは自前みたいだけど、あいかわらずソースが読めない(Perlの場合は、VMSなどIEEE754でないシステムにも対応していてifdefが多いせいでもある)。
で、結局、数値を下9桁とそれ以上とに分割し、それらを独立に計算した後、 最後に加算することで精度を確保した。加算で発生した誤差が拡大するから、 加算→乗算、ではなく、乗算→加算の順序で計算しなければならないのだった。
付け焼き刃だが、勉強になった。
*1 localeによっては小数点がカンマだったりするので
体調が悪いので早く休もう、と思っていたのに、寝たのは3時くらいだった。 どうしてこう一人では生活が管理できないのか。