kvライブラリを0.4.31にversion upしました。前回からいくらも経っていませんが、またversion upです。今回は重大なバグフィックスです。文字列で表された数値から区間への変換に問題がありました。
具体的には、
#include <kv/interval.hpp>
#include <kv/rdouble.hpp>
int main()
{
std::cout.precision(17);
std::cout << kv::interval<double>("1e-1000") << "\n";
std::cout << kv::interval<double>("1e1000") << "\n";
}
のようなプログラムの出力が、
[0,0]
[inf,inf]
となってしまう問題です。これを、正しく
[0,4.9406564584124655e-324]
[1.7976931348623157e+308,inf]
となるように修正しました。
これは、文字列をdoubleに変換する関数stringtod (kv/conv-double.hpp内にある) で、絶対値が2-1075より小さい値を無条件で0に、絶対値が21024より大きい値を無条件でinfにしてしまっていたせいです。正しくは、丸めモードを見て、絶対値が小さくても上向き丸めなら2-1074を、絶対値が大きくても下向き丸めなら21024-2971(C言語で言うところのDBL_MAX)を返すべきでした。
kv-0.4.31では、kv/conv-double.hppとkv/conv-dd.hppをそのように修正しました。