2013-02-19 56 views
2

對於舍入到最近的浮點算術,我有點困惑。令a,b和c爲標準化的雙精度浮點數。 a + b = b + a其中+正確舍入到最接近的浮點加法是真的嗎?我最初的猜測是肯定的,這總是如此,但我並不完全理解到最近的四捨五入。有人可以給出一個例子,當a + b!= b + a使用浮點加法並舍入到最近?對最接近的浮點算術舍入

回答

3

無論舍入模式如何,正確實施IEEE-754浮點加法都是可交換的(a + b等於b + a)。

舍入模式會影響精確的數學結果是如何舍入以適合目標格式的。由於a + b和b + a的確切數學結果是相同的,所以它們是相同的。

+0

我明白了。它是否也是聯想?例如,(a + b)+ c = a +(b + c)? – SKLAK 2013-02-19 17:53:16

+1

@SKLAK:不容易反例:'a = 1e16,b = -1e16,c = 1'。 – 2013-02-19 18:08:02

+0

算術不關聯,因爲在發生舍入錯誤時更改操作的順序會發生變化。例如,計算的「(a + b)+ c」和「a +(b + c)」在數學上是f(f(a + b)+ c)'和'f(a + f(b + c)) ',其中'f'是將精確的數學值舍入爲浮點數值的函數。 f(a + b)'與f(b + c)'具有相同的舍入誤差通常沒有理由,所以這些可能會產生不同的結果。 – 2013-02-19 18:51:47

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