[英]How does this algorithm to calculate square root work?
我找到了一段数学代码来计算实数值的平方根。 我显然理解代码本身,但我必须说我非常理解该算法的数学逻辑。 它是如何工作的?
inline
double _recurse(const double &_, const double &_x, const double &_y)
{ double _result;
if(std::fabs(_y - _x) > 0.001)
_result = _recurse(_, _y, 0.5 * (_y + _ / _y));
else
_result = _y;
return _result;
}
inline
double sqrt(const double &_)
{ return _recurse(_, 1.0, 0.5 * (1.0 + _)); }
假设您要计算√a
并找到一个近似值x
。 您想通过向x
添加一些校正δ
来改进该近似值。 换句话说,你想建立
x + δ = √a
或者
(x + δ)² = x² + 2xδ + δ² = a
如果忽略小项δ²
,则可以求解δ
并得到
δ ~ (a - x²)/(2x)
最后
x + δ ~ (a + x²)/(2x) = (a/x + x)/2.
这个过程可以迭代并很快收敛到√a
。
例如对于a=2
和初始值x=1
,我们得到近似值
1, 3/2, 17/12, 577/408, 665857/470832, ...
和相应的方块,
1, 2.25, 2.00694444..., 2.0000060073049..., 2.0000000000045...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.