上一个版本使用了2分法计算整数平方根,光光看代码也觉得有些麻烦吧,收敛也比较慢,vc6在80左右的时候就要说模板递归太深受不了了。
现在在来看一个用牛顿迭代法来加速收敛的方法。迭代次数大大减少,vc6可以支持到大约225了。
还是上代码。和上一份比,代码有些很小的变动。4个宏依然继续可以用。
上菜
要点:enum {next = (M1 + N/M1)/2}; //newton iterator method
y=x
2
= > x=(x+y/x)/2
而当y大于0时,(x+y/x)/2 的不动点只有一个:y
1/2
这个例子很直白的告诉我们,算法一点小的进步,coder就可以向前进一大步。
走路先走头,再走脚。你说这是什么科学家呢?