2014-04-25 134 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

據我所知,第一種方法將因爲在一些的數字將被截斷,並且四捨五入每次加入概率之後的第二方法產生更精確的結果是更然後單個乘法器操作的結果將被計算一次然後這些數字將被截斷。