不使用内置函数计算平方根时x=(x + n/x)/2迭代公式的原理是什么
你给出的代码是牛顿迭代法求解平方根的经典实现,核心迭代逻辑解释如下:
相关代码回顾
double n = 50, x = 1, last_x = 1; do { last_x = x; System.out.println(last_x); x = (x + n / x) / 2; } while (last_x != x); System.out.println("Result: " + x);
迭代公式的赋值逻辑
这个公式来自牛顿-拉夫逊迭代法,目标是求解方程 x² = n 的正实根(也就是n的平方根):
- 我们要找的平方根s满足
s = n/s,如果当前的迭代值x比s大,那么n/x就会比s小,反之如果x比s小,n/x就会比s大 - 迭代步骤相当于取x和n/x的算术平均值,每次迭代都会把两个分别大于、小于真实平方根的数做平均,得到的结果会比原来的x更接近真实的s
- 从数学推导的角度看:我们把求平方根转化为求函数
f(x) = x² - n的零点,对f(x)求导得导数为2x,代入牛顿迭代的通用公式x_{k+1} = x_k - f(x_k)/f'(x_k),整理后就刚好得到x = (x + n/x)/2
选择该公式的原因
- 收敛速度极快:对双精度浮点数来说,通常只要6-7次迭代就能达到精度上限,哪怕初始值选的比较差,收敛速度也远高于二分法等其他求根方案
- 实现成本极低:只用到四则运算,不需要依赖任何数学内置函数,完全符合你不使用
Math.sqrt()的需求 - 精度判断简单:当两次迭代的x值完全相等时,说明已经达到了双精度浮点数能表示的最精确结果,直接停止迭代即可
内容的提问来源于stack exchange,提问作者Linh Đàm
相关产品推荐
相关产品推荐

