検証のために、特定の算術計算中に表現可能な値に丸められるため、累積誤差のかなり厳しい上限を計算できるようにしたいと考えています。
foo()
特定の算術計算を実行すると主張する関数があるとします。float
また、関与する型がorであることに起因する最大誤差 (丸めによる) について暗黙の保証があると仮定し、計算を実行double
する暗黙の (または記述された) 方法があると仮定します。foo()
foo()
蓄積された最悪の場合のエラーを追跡する方法で計算を実行することにより、特定の入力値のセットの結果を検証し、2 つの結果が最終的な結果に近いかどうかを確認できるようにしたいと考えています。最悪のエラー要求。
基本的な浮動小数点型の 1 つに精度の追跡を追加する新しい算術クラスを導入することでこれを行うことができると想像しtrack_prec<T>
、そのクラスの算術演算子の実装に任せて最悪の値を計算します。 -各部分式の大文字と小文字のエラー。私の問題は、これらの一般的なケースでこれらの最悪のエラーを計算する方法がわからないことです。
// T = float or double
template<class T> class track_prec {
public:
T value;
T ulp; // http://en.wikipedia.org/wiki/Unit_in_the_last_place
track_prec& operator+=(const track_prec& v)
{
value += v.value;
ulp = ???; // How to do this? And what about -=, *=, and /=?
}
friend bool operator==(T, const track_prec&)
{
// Exactly how should this comparison be done?
}
};
たとえば、これfoo()
が数列の単純な合計であるとします。track_prec<T>
次に、次のように使用できます。
std::vector<T> values { 0.4, -1.78, 1.3E4, -9.29E3, ... };
CHECK_EQUAL(std::accumulate(values.begin(), values.end(), track_prec<T>()),
foo(values.begin(), values.end()));
もちろん、あらゆる種類のヘルプを歓迎しますが、フリーで動作するコードへのポインタは非常に便利です。
この件に関するこれらのリンクを見つけましたが、私の質問に対する直接的な回答は得られないようです。