2026/06/28(日)kv-0.4.61
今回は、精度保証は破れていないものの精度で損をする可能性があった不具合の修正です。具体的には、文字列からdoubleなどの数値へ上向き丸めで変換するとき、"9007199254740992" (ぴったり2^{53})などいくつかの誤差無しでdoubleに変換できるはずの数が1ulp上に丸まってしまうというバグがありました。これにより、区間xをx = "9007199254740992";みたいに初期化すると本来幅0の区間になるはずが僅かに幅のある区間になって損をしてしまっていました。
この不具合を修正しました。
これにより、例えば以下の文字列を上向き丸めで変換したときの結果が正常になりました。
| 変換先の型 | 文字列 | 修正前 | 修正後 |
|---|---|---|---|
| double | "9007199254740992" | 9007199254740994 | 9007199254740992 |
| long double | "18446744073709551616" | 18446744073709551618 | 18446744073709551616 |
| dd | "162259276829213372398777265029120" | 1.6225927682921336\cdots \times 10^{32} + 9007199254740994 | 1.6225927682921336\cdots \times 10^{32} + 9007199254740992 |
| ddx | "680564733841876926963642703010955526144" | 6.80564733841876927\cdots\times 10^{38} -36893488147419103230 | 6.80564733841876927\cdots\times 10^{38} -36893488147419103232 |
2026/05/30(土)kv-0.4.60
今回は、g++-13での仕様変更により0.4.56からg++-13以上で利用できなくなっていた、Intel 80bit浮動小数点数のサポートを復活させました。
以前は、Intel FPUに盲腸のように存在してる80bit浮動小数点数を_Float64xという型で記述して活用していましたが、g++-13から、
#include <iostream>
int main()
{
_Float64x x;
std::cin >> x;
}
みたいな簡単なプログラムさえコンパイルできなくなっていました。仕方ないのでg++-13以上ではこの機能を抹消していたのですが、long doubleを使えば問題なく動いていたので、今回ソースコード中の_Float64xを全部書き直しました。また将来状況が変わって振り回されるのは嫌なので、kv::fp80というaliasを作って全部それで書くことにして、状況が変わったらすぐにまた変更できるように備えました。80bit(仮数部64bit)の浮動小数点数を使って区間演算をしたり、2つ束ねて仮数部128bitの疑似拡張4倍精度を使ったり、またその疑似拡張4倍精度を端点に持つ区間演算をしたり、結構面白いことができます。もちろんmpfrを使えばもっと高精度にすることもできますが、mpfrより速度低下がずっと小さいです。doubleやddじゃ微妙に精度が足りないが、mpfrでは遅すぎるというギリギリのケースで役に立ちことがあるかもしれません。
2026/03/16(月)kv-0.4.59
いくつかバグが溜まってきて、そろそろ放出したくなりました。
- double/ddで、DBL_MAX/3がNaNになってしまう問題の修正。
- eig.hppのeig(近似固有値計算)で、稀に無限ループに陥ってしまうバグを修正 (Thanks to Codex CLI)。
- 区間演算のsin,cosで、極値を含む判定を厳密に (Thanks to 岩波さん)。
- exp(interval<dd>(1000.))がなぜか[-inf,inf]になってしまうバグの修正。
eigはずっと直したかったのですが、AI様に聞いたら一発で直してくれました。精度保証のプログラムをAIに書かせるのは怖いですが、近似計算の部分ならいいでしょう。
最後のバグは、dd区間演算でオーバーフローして端点が無限大になるようなケースでいろいろ不具合が見つかりました。区間が広がってしまうバグなので嘘は付いていないでしょうけど、dd区間演算でなぜか極端に区間幅が大きくなって断念してしまったようなことがあれば、もしかしたらこのせいかもしれません。
学生たちの頑張りで、affine arithmeticは大きく改善できることが分かり書き換えたいですが、大改造になりそうなのでそれは次回にします。
また、githubで、今までversion情報はcommit messageにしか入れていなかったのですが、"v0.4.59"みたいなtagも付加するようにしました。githubは何も分かっていないですがいくらかまともになった?