2013-02-19 32 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