如何比Newton Raphson更有效地计算大十进制的平方根?

时间:2014-01-20 08:19:58

标签: java algorithm bit-manipulation

我想在我的应用程序中计算一个大小数的平方根。请不要建议一些第三方实用程序,因为我不能进入许可循环。 我一直在使用Newton-Raphson方法,但因为它使用了pow并且大量分配操作。我可以看到它减慢了我在profiler中的应用程序。你们能为我建议一些好的实现吗? 可能存在一些不同于Newton-Raphson的算法,或者如果没有,则使用按位运算可以更快地实现它。

1 个答案:

答案 0 :(得分: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));
}

您可以调整迭代次数以匹配您的精确度和执行时间要求。但与Newton-Raphson相比,我不知道这是如何运作的。