2016/04/02(土)kv-0.4.32
またまたバグフィックスです。intervalとddのsinhとcoshに、引数が負で絶対値が大きい場合に、ゼロ除算が発生してしまうバグがありました。
#include <kv/interval.hpp> #include <kv/rdouble.hpp> typedef kv::interval<double> itv; int main() { std::cout << sinh(itv(-710.)) << "\n"; }のようなプログラムを実行すると、
terminate called after throwing an instance of 'std::domain_error' what(): interval: division by 0 中止 (コアダンプ)のようになってしまっていました。これを、正しく
[-inf,-8.98846e+307]となるように修正しました。誤った数値を黙って返してしまうのは精度保証的には最悪ですが、停止するのでそれよりマシとは言えみっともないバグではあります。
この原因は、sinh(x)=(exp(x)-exp(-x))/2を、expの計算を一回で済まそうとして(exp(x)-1/exp(x))/2で計算していたため、exp(x)が(値がが小さすぎて)ゼロを含むような場合にゼロ除算が起きてしまうというものでした。xの正負で場合分けして、xが負なら(1/exp(-x)-exp(-x))/2で計算する、というような対策をしました。