2014/12/08(月)kv-0.4.15、シンプルな区間演算ライブラリ

kvライブラリを0.4.15にアップデートしました。

今回は、ベキ級数演算の乗算の問題を修正しました。ベキ級数演算では次数を上げながら同じ式を何度も計算する場面が多く、そのときに前回の計算結果を流用すると高速化できるため、計算の履歴を保存しておいて再利用する機構を持っています。ベキ級数の乗算においてこの再利用部分にバグがあり、区間幅が狭くなってしまうことがありました。これは、Type-I PSAの直後にType-II PSAを行った場合のみ稀に発生します。精度保証への影響ですが、常微分方程式ではその計算は候補者集合の大きさを決める目安として使うだけなので恐らく影響なし、数値積分の方は精度保証結果に影響していた可能性があります。

もう一つ、区間演算で、"0.1" < xのように左側に文字列、右側に区間が来るような不等号が正しく計算されないバグも見つかり、修正しました。この計算は自分のライブラリ内では一箇所も使っていませんでしたが、interval.hppを既に何かに利用されている方がいたら、そのプログラムに影響します。

また、久しぶりにVisual Studio 2013でコンパイルしてみたら、新規に書いた部分でいくらかコンパイルが通らない箇所があったので修正しておきました。

「お前のプログラムは本当に精度保証できているのか」と不安になるようなアップデート内容ですが、こうして一つ一つ問題点を修正して完成度を高めていくしかないと信じています。

おまけ: kvライブラリの区間演算の部分を切り出して、簡単な区間演算ライブラリを作ってみました。

interval-simple.tar.gz
  • テンプレートを排除しました。従って内部型はdoubleのみですが、プログラムが読みやすくなっています。
  • テンプレートを排除したおかげでboostに依存しません。単体で使えます。
  • 必要なファイルはinterval.hpp一つです。
  • 内部型のカスタマイズが出来ないこと以外は、kvライブラリに含まれるinterval.hppと機能は同等です。数学関数も多数あります。
  • 丸めの変更は単純にfesetroundを使っています。
  • 文字列との方向丸め付き相互変換機能もあります。従って、文字列からその文字列の表す数値を含むように区間を初期化できるし、表示も真の値を含むように外側に丸めるようになっています。
  • volatileを使った最適化対策はきちんとやってます。
ちょっと区間演算を使うだけならkvライブラリは少し大掛かりなので、気軽に使うならこのくらいでいいかも、と思ってます。また、ライブラリを読んで仕組みを知りたい人には読みやすいと思います。
OK キャンセル 確認 その他