2014-04-25 31 views
3

假设我们实现了以下两种方法来计算一个实数xn日多。哪种方法更准确?

public static double multiply(double x, int n) 
{ 
    return x * n; 
} 

public static double iterativeAdd(double x, int n) 
{ 
    double a = 0.0; 

    for(int b = 0; b < n; b++) 
    { 
     a += x; 
    } 

    return a; 
} 

假设n是一个法律int和两个xn精确的数学产品和x是绝对值不低于Double.MIN_VALUE(除非都是0.0)和绝对值在Double.MAX_VALUE没有更大。以下是我想知道的:一般来说,这与xn的产品的确切值更接近:doublemultiply(x, n)返回或doubleiterativeAdd(x, n)返回,您如何知道?

回答

1

一般情况下,你做的每浮点运算,你epsilon增加。发生这种情况是因为浮点数在内存中具有固定大小,限制了它们的精度。每个操作四舍五入到浮点数可以表示的最接近的值。这个四舍五入在一段时间后积累。

这两个数字都会让你非常接近答案,但是如果你在一大组不同的数字上运行这两种方法,那么平均而言,iterativeAdd()与实际值的距离会更大。

此外,multiply()将在任何机器上显着更快,所以使用iterativeAdd()没有任何好处。

0

两者都会返回大致相同的值,但iterativeAdd()将返回更多近似值的可能性更大,但差异可以忽略不计。

在一些精度损失无论多小的任何单浮点操作的结果。

multiply()你只使用浮动操作一次,但在iterativeAdd()你使用它n次。

一般来说,我们应该避免使用像iterativeAdd()这样的函数,因为它会占用大量的处理器时间,并且会影响浮点运算。

2

据我所知,第一种方法将因为在一些的数字将被截断,并且四舍五入每次加入概率之后的第二方法产生更精确的结果是更然后单个乘法器操作的结果将被计算一次然后这些数字将被截断。