6

加算は、IEEE 754 (IEC 559) 浮動小数点標準x + xの乗算によって交換可能ですか、またはより一般的に言えば、常にまったく同じ結果が得られるという保証はありますか?2 * xcase_addcase_mul

#include <limits>

template <typename T>
T case_add(T x, size_t n)
{
    static_assert(std::numeric_limits<T>::is_iec559, "invalid type");

    T result(x);

    for (size_t i = 1; i < n; ++i)
    {
        result += x;
    }

    return result;
}

template <typename T>
T case_mul(T x, size_t n)
{
    static_assert(std::numeric_limits<T>::is_iec559, "invalid type");

    return x * static_cast<T>(n);
}
4

4 に答える 4

9

IEEE 754 (IEC 559) 浮動小数点規格では、加算x + xは乗算と互換性がありますか?2 * x

はい、どちらも数学的に同一であるため、同じ結果が得られます (結果は浮動小数点で正確であるため)。

またはより一般的に言えば、 case_add と case_mul が常にまったく同じ結果をもたらすという保証はありますか?

一般的ではありません。私が言えることから、それは続くようですn <= 5

  • n=3: そのままx+x(丸めを含まない) であるため(x+x)+x、最終ステップで丸めを 1 回だけ行います。
  • n=4(そして、デフォルトの丸めモードを使用しています)そして

    • の最後のビットxが 0の場合、x+x+xは正確であるため、結果は と同じ引数で等しくなりますn=3
    • 最後の 2 ビットが01の場合、 の正確な値は のx+x+x最後の 2 ビット1|1(ここで | は形式の最後のビットを示します) になり、切り上げられて になり0|0ます。次の加算では正確な結果が得られる|01ため、結果は切り捨てられ、前の誤差が相殺されます。
    • 最後の 2 ビットが11の場合、 の正確な値は のx+x+x最後の 2 ビットに0|1なり、切り捨てられて になり0|0ます。次の加算では正確な結果が得られる|11ため、結果は切り上げられ、前のエラーが再びキャンセルされます。
  • n=5(ここでも、デフォルトの丸めを想定しています):x+x+x+xは正確であるため、 と同じ理由で保持されn=3ます。

n=6失敗するxからです。_ _ _ _1.0000000000000002double1.06x6.000000000000002x+x+x+x+x+x6.000000000000001

于 2016-10-04T15:55:10.887 に答える
3

nたとえば、 の場合pow(2, 54)、乗算は正常に機能しますが、加算パスでは、結果の値が入力よりも十分に大きくなるとxresult += xが生成されresultます。

于 2016-10-04T15:18:39.500 に答える
1

のアキュムレータresultcase_add大きくなりすぎると、加算xによって丸め誤差が発生します。ある時点で、追加xしてもまったく効果がありません。したがって、関数は同じ結果をもたらしません。

たとえば、double x = 0x1.0000000000001p0(16 進浮動小数点表記) の場合:

n  case_add              case_mul

1  0x1.0000000000001p+0  0x1.0000000000001p+0
2  0x1.0000000000001p+1  0x1.0000000000001p+1
3  0x1.8000000000002p+1  0x1.8000000000002p+1
4  0x1.0000000000001p+2  0x1.0000000000001p+2
5  0x1.4000000000001p+2  0x1.4000000000001p+2
6  0x1.8000000000001p+2  0x1.8000000000002p+2
于 2016-10-04T15:32:09.560 に答える
1

はい、しかし一般的には成り立ちません。指数を変更したため、2 より大きい数値で乗算しても同じ結果が得られない可能性があり、加算に置き換えると少し低下する可能性があります。ただし、加算演算に置き換えられた場合、2 による乗算は少し低下することはありません。

于 2016-10-04T15:27:50.607 に答える