2016/03/28(月)kv-0.4.31
具体的には、
#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をそのように修正しました。