如何比牛顿·拉夫森(Newton Raphson)更有效地计算大十进制的平方根



我想计算应用程序中大十进制的平方根。请不要建议一些第三方公用事业,因为我不能参加许可循环。我一直在使用Newton-Raphson方法,但由于它使用了POW并大量使用操作。我可以看到它减慢了我在Profiler中的应用程序。你们能为此建议我一些很好的实施吗?要么有一些不同的算法与牛顿 - 拉夫森有不同的算法,要么可能是使用位操作的速度更快地实现。

您可以使用二进制搜索找到平方根。这样的东西:

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));
}

您可以调整迭代次数,以匹配您的精度和退出时间重新审查。但是我不知道与牛顿 - 拉夫森相比如何工作。

最新更新