«前の日記(2006年05月10日) 最新 次の日記(2006年05月12日)» 編集

Matzにっき


2006年05月11日 [長年日記]

_ 講習会

にいるのだが、実際は内職で原稿を書いている。

やっぱ浮動小数点数なんてテーマを選ぶんじゃなかったなあ、 と公開後悔することしきり。なんか、さんざん苦労して書いたあげく 読者から「間違ってます」なんて指摘を受けるんじゃないかと。

一番苦労するのは、誤差の実例で、 教科書的な例題だとfloatを使って誤差を出しているんだけど、 RubyのFloatは内部的にはdoubleを使っているので

  • 簡単な例では、誤差が十分に小さい
  • 誤差が見えるほど蓄積しちゃうと、はんぱな誤差修正では補正しきれない

と悩ましい限りだ。

ま、良い例題が見つかってしまえば後は楽ってのは原稿書きの常だけど。 で、いつもうまくいっているわけではないというのが、悩ましい*1

*1  「いつもうまくいっているわけではない」が「いつもうまくいっていない」か「いつもうまくいっている、というわけではない」のいずれであるかが大問題なのだが....聞かないで。

_ strtod(3)

localeの問題で自前で実装を準備したstrtod(3)だが*1、どうも精度が悪いらしい。プラットフォームによっては有効数字が16桁出ないでmake testでエラーが出るようだ。本来は10進18桁近くあるはずなのにな。

試してみると、その辺に転がっているフリーのstrtod(3)実装は軒並み精度がその程度しかない。見るとPythonは内部でシステムのatod(3)を使っている。Perlは自前みたいだけど、あいかわらずソースが読めない(Perlの場合は、VMSなどIEEE754でないシステムにも対応していてifdefが多いせいでもある)。

で、結局、数値を下9桁とそれ以上とに分割し、それらを独立に計算した後、 最後に加算することで精度を確保した。加算で発生した誤差が拡大するから、 加算→乗算、ではなく、乗算→加算の順序で計算しなければならないのだった。

付け焼き刃だが、勉強になった。

*1  localeによっては小数点がカンマだったりするので

_ 夜なべ

体調が悪いので早く休もう、と思っていたのに、寝たのは3時くらいだった。 どうしてこう一人では生活が管理できないのか。


«前の日記(2006年05月10日) 最新 次の日記(2006年05月12日)» 編集