通过逐次逼近实现平方根法

时间:2016-04-08 13:27:38

标签: algorithm square-root

通过逐次逼近确定平方根是使用以下算法实现的:

  1. 首先猜测平方根是x / 2.调用猜测g。

  2. 实际的平方根必须介于g和x / g之间。在逐次逼近的每一步,通过平均g和x / g产生一个新的猜测。

  3. 重复步骤2,直到g和x / g的值尽可能接近硬件的精度。在Java中,检查此条件的最佳方法是测试平均值是否等于用于生成它的任一值。

  4. 让我感到困惑的是第3步的最后一句话。我将其解释如下:

    1

    这似乎只会导致无限循环。我正在精确地遵循算法,如果平均值等于g或x / g(用于生成它的两个值),那么我们有答案吗?

3 个答案:

答案 0 :(得分:0)

要检查g和x / g是否与HW允许的一样接近,请查看相对差异并进行比较 它与您的浮点格式的epsilon。如果它在epsilon的小整数倍内,你就可以了。

x和y的相对差异,请参阅https://en.wikipedia.org/wiki/Relative_change_and_difference

32位IEEE浮点数的epsilon约为1.0e-7,与此处的其他答案之一相同,但该答案使用了绝对值而不是相对差值。

在实践中,这意味着:

 Math.abs(g-x/g)/Math.max(Math.abs(g),Math.abs(x/g)) < 3.0e-7

答案 1 :(得分:0)

为什么有人会使用这种方法,因为他们可以简单地使用 (2n^2) = 4n^2 和 (n + 1)^2 = n^2 + 2n + 1 的公式来填充每个位尾数,然后将指数除以 2,将尾数乘以 2 仅当当指数与 2 的模数等于 1?

答案 2 :(得分:-1)

绝不比较浮点值是否相等。结果不可靠。

像这样使用epsilon:

if(Math.abs(average-g) < 1e-7 || Math.abs(average-x/g) < 1e-7) 

您可以将epsilon值更改为您需要的任何值。可能最好的是与原始x相关的东西。

相关问题