创新工厂的笔试题:
不用库函数sqrt(),求一个整型数N的开方,要求精度达到0.001即可。
在这里首先介绍一下牛顿迭代法:
假设一个方程为
f(x) = 0;
那么假设其解为x0,则用泰勒级数展开之后可得:
f(x) = f(x0) + f'(x0)(x - x0) = 0
其中x为其近似解。
根据上式推导出:
x = x0 - f(x0) / f'(x0)
这是一个递推公式,此处可以假设x0为近似解,递推无数次之后,都可以得到近似于正确解的值x
现在来看这道笔试题:
f(x) = x * x - N
我们可以假设一个近似解d = 1.0,根据牛顿迭代法,递推无数次之后可以得到精确的近似解。
因此:
x = d - f(d) / f'(d)
= d - (d * d - N) / (2d)
= (d + N / d) / 2
将上式用函数迭代至精度满足要求即可。
最终函数相当简单:
double SQRT(unsigned int N) {
double d = 1.0;
while (abs(d * d - N) > 1e-9) {
d = (d + N / d) / 2;
}
return d;
}