2014-01-20 60 views
3

我想在我的應用程序中計算大數小數的平方根。請不要建議一些第三方公用事業,因爲我不能進入授權循環。 我一直在使用Newton-Raphson方法,但是因爲它使用了pow和分割操作。我可以看到它在Profiler中減慢了我的應用程序。你們可以爲我推薦一些很好的實施嗎? 或者可以有一些不同於Newton-Raphson的算法,或者如果不是,則可以使用按位運算來更快地實現它。如何比牛頓拉夫森更有效地計算大十進制的平方根?

+0

牛頓法的二次收斂很難被打敗。只要確保,你從平方根的一個好初始估計開始。以雙精度計算的平方根可能是一個好的開始。 – Henry

+0

@Naman對於使用pow函數的是什麼? –

+0

@VikramBhat我正在使用這個實現http://stackoverflow.com/questions/13649703/square-root-of-bigdecimal-in-java – Naman

回答

0

您可以使用二分查找找到平方根。 類似的東西:

BigDecimal sqrt(BigDecimal a){ 
    BigDecimal left = BigDecimal.ZERO; 
    BigDecimal right = a; 

    for (int i = 0; i < BINARY_SEARCH_ITER_COUNT; ++i) { 
     BigDecimal middle = left.add(right).divide(BigDecimal.valueOf(2)); 

     if (middle.multiply(middle).compareTo(a) < 0) { 
      left = middle; 
     } else { 
      right = middle; 
     } 
    } 

    return left.add(right).divide(BigDecimal.valueOf(2)); 
} 

您可以調整迭代次數,以配合您的精度和exectuion時間requrements。但我不知道這與牛頓 - 拉夫遜相比如何運作。

+1

二元搜索比Newton-Raphson算法慢。二元搜索具有線性收斂性,而牛頓 - 拉夫遜具有二次收斂性。 –

+0

同意@ChrisTaylor ...通過Newton-Raphson的二進制搜索速度非常慢 –