2014/11/24(月)kv-0.4.13

kvライブラリを0.4.13にアップデートしました。
今回は、やや重大なバグの修正です。ddの表示が正しくなかったというものです。
#include <kv/dd.hpp>

int main()
{
        kv::dd x;
        int i;
        std::cout.precision(34);

        for (i=1; i<9; i++) {
                x = i / (kv::dd)9;
                std::cout << x << "\n";
        }
}
の実行結果が、
0.1111111111111111111111111111111108
0.2222222222222222222222222222222215
0.3333333333333333333333333333333323
0.4444444444444444444444444444444431
0.5555555555555555833111311711844704
0.6666666666666666666666666666666646
0.7777777777777777916555655855922352
0.8888888888888888888888888888888861
となってしまっていました。5/9, 7/9の値がおかしいことが分かります。これは、内部では正しく計算していますが、double-doubleを表示(文字列変換)するときに一つ目と二つ目のdoubleの符号が違うとうまく表示されないというバグのせいです。

文字列変換部 (conv-dd.hpp) は、元々luaという言語で書いていて、それが正しく動くのを確認してC++に移植するという手順を踏んだのですが、負数に対する%(剰余演算子)のluaとC++での違いに起因するものでした。

修正して、ちゃんと
0.1111111111111111111111111111111108
0.2222222222222222222222222222222215
0.3333333333333333333333333333333323
0.4444444444444444444444444444444431
0.5555555555555555555555555555555569
0.6666666666666666666666666666666646
0.7777777777777777777777777777777785
0.8888888888888888888888888888888861
と表示されるようになりました。

こういうバグはすぐに修正せねばなりません。ついでに、affineにいくつか関数を追加したり、ソースコードをいくらかクリーンアップしたりしました。
OK キャンセル 確認 その他