2

検証のために、特定の算術計算中に表現可能な値に丸められるため、累積誤差のかなり厳しい上限を計算できるようにしたいと考えています。

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()));

もちろん、あらゆる種類のヘルプを歓迎しますが、フリーで動作するコードへのポインタは非常に便利です。

この件に関するこれらのリンクを見つけましたが、私の質問に対する直接的な回答は得られないようです。

4

2 に答える 2

3

浮動小数点計算の精度を追跡する最も簡単な方法は、区間演算と呼ばれます。IEEE 754 演算は必要ありませんが、計算を切り上げまたは切り下げに切り替えることができるため、各ステップで計算された間隔の境界には、実数で実行された場合に同じ計算から得られた可能性のあるすべての実数が含まれます。算術。

区間演算の多くの既存の実装を見つけることができるはずです。

特定のステップでの計算の精度は、そのステップで計算される間隔の幅です。

定数に注意してください: πx を近似したい場合は、π を含む浮動小数点区間に x の区間を掛ける必要があります。x の区間に として示される double を3.1415926535897932掛けると、x にその double (π にも 3.1415926535897932 にも等しくない) を掛けた誤差が得られます。質問のコードでは、定数0.4は「0.4 に最も近い double」を意味します。有理数 4/10 が必要な場合は、 と でそれぞれ示される 2 つの double を境界とする区間を使用し3.9999999999999997e-01ます4.0000000000000002e-01

于 2013-10-06T15:15:18.680 に答える
2

エラー追跡の実装方法については、こちらをご覧ください。 https://github.com/Esri/geometry-api-java/blob/master/src/main/java/com/esri/core/geometry/ECoordinate.java

基本的な考え方は、浮動小数点演算の結果が正しい値 +- 0.5 * DBL_EPSILON * 値に近いということです。そのため、追跡して蓄積することができます。上記のリンクのコードは、a + b の絶対誤差を次のように計算します。

err(a+b) = err(a) + err(b) + DBL_EPSILON * abs(a + b). 

前提: IEEE 754 倍精度浮動小数点演算ではガード ビットが使用されます。

于 2015-10-30T02:32:02.337 に答える