通过逐次逼近确定平方根是使用以下算法实现的:
首先猜测平方根是x / 2.调用猜测g。
实际的平方根必须介于g和x / g之间。在逐次逼近的每一步,通过平均g和x / g产生一个新的猜测。
重复步骤2,直到g和x / g的值尽可能接近硬件的精度。在Java中,检查此条件的最佳方法是测试平均值是否等于用于生成它的任一值。
让我感到困惑的是第3步的最后一句话。我将其解释如下:
1
这似乎只会导致无限循环。我正在精确地遵循算法,如果平均值等于g或x / g(用于生成它的两个值),那么我们有答案吗?
答案 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相关的东西。