2

浮動小数点演算で最も近い値に丸めることについて少し混乱しています。a、b、およびcを正規化された倍精度浮動小数点数とします。+が最も近い浮動小数点の加算に正しく丸められるa+b = b + aというのは本当ですか?私の最初の推測では、これは常に当てはまりますが、最も近い値への丸めについては完全には理解していません。誰かが、a + b!= b + aが浮動小数点加算を使用し、最も近い値に丸める場合の例を挙げてもらえますか?

4

2 に答える 2

3

適切に実装されたIEEE-754浮動小数点加算は、丸めモードに関係なく可換です(a+bはb+aに等しい)。

丸めモードは、正確な数学結果を宛先形式に合わせるために丸める方法に影響します。a+bとb+aの正確な数学的結果は同一であるため、それらは同じように丸められます。

于 2013-02-19T17:30:37.277 に答える
0

上記のように、加算は可換ですが、結合的ではありません。丸めモードの違いは、次の(MS Visual Studio)C++コードを実行することで確認できます。

#include <iostream>
#include <float.h>

#pragma fenv_access(on)

using namespace std;

int main(int argc, char* argv[])
{
    float a = 1.75f, b = 1e-6f;

    cout.setf(ios::fixed,ios::floatfield);
    cout.precision(7);

    cout << "a = " << a << ", b = " << b << endl;

    _controlfp_s(NULL, _RC_DOWN,_MCW_RC);

    cout << "Result of a + b rounded down: " << a+b << endl;
    cout << "Result of a - b rounded down: " << a-b << endl;

    _controlfp_s(NULL, _RC_UP,_MCW_RC);
    cout << "Result of a + b rounded up: " << a+b << endl;
    cout << "Result of a - b rounded up: " << a-b << endl;

    _controlfp_s(NULL, _RC_NEAR,_MCW_RC);
    cout << "Result of a + b rounded to nearest: " << a+b << endl;
    cout << "Result of a - b rounded to nearest: " << a-b << endl;

    return 0;
}

出力:

a = 1.7500000, b = 0.0000010
Result of a + b rounded down: 1.7500010
Result of a - b rounded down: 1.7499989
Result of a + b rounded up: 1.7500011
Result of a - b rounded up: 1.7499990
Result of a + b rounded to nearest: 1.7500010
Result of a - b rounded to nearest: 1.7499990
于 2013-02-19T20:11:17.407 に答える