2016/04/28(木)kv-0.4.34

kvライブラリを0.4.34にアップデートしました。

今回は関根晃太さんの指摘で気づいた問題点の修正です。dd.hppでsqrtやlogに負の値を入れたときに正しくエラーになっていなかった問題を修正しました。これは、interval<dd>では問題は発生せず、ddを単体で使ったとき(つまり精度保証でなく近似計算)の場合のみ発生します。

また、conv-double.hpp, conv-dd.hppで、手抜きしてsprintfを使っていたのを、C++らしく書き直しました。

更に、現在ubuntu 16.04を試用中なので、gcc 5.3とclang 3.8で全てのサンプルをコンパイルしてみました。細かく数値まで精査したわけではありませんが、問題なく動いているようです。

2016/04/15(金)kv-0.4.33

kvライブラリを0.4.33にアップデートしました。

今回は、Visual C++でconv-double.hpp, conv-dd.hppがコンパイル出来ないというご指摘を頂いたので修正しました。この2つのファイルは元々luaというスクリプト言語でプロトタイプを開発し、それをC++に移植したものです。luaのif文の中のand(論理積)を&&に直すのを忘れていた箇所があって、何故か古いVCやgccではこれがコンパイルエラーにならなかったので気づかなかった、というものです。@quartorzさん、@nikqさん、ご指摘ありがとうございました。

その他、自動微分の使い方の説明に少し追記しました。

某S先生がC++11の機能を使っていろいろ作ってるのが楽しそうで、kvもC++11に移行したい気分が高まっています。しかしほぼ全体に及ぶ大手術になるので大変だなあ。

2016/04/02(土)kv-0.4.32

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で計算する、というような対策をしました。
OK キャンセル 確認 その他