可能有人連平方根是怎么計(jì)算的都不知道,我指的是計(jì)算機(jī)是怎么計(jì)算的。
其實(shí)有很多種辦法都可以計(jì)算平方根,我們一般會(huì)用#include <math.h>
那庫(kù)函數(shù)用的是哪種算法呢。
用的是牛頓迭代法,什么是牛頓迭代法?看如下算式
newton.PNG
Gn是什么,是上一次的預(yù)估,可以證明,當(dāng)這個(gè)計(jì)算被不停迭代的話(huà),結(jié)果會(huì)無(wú)限逼近我們想要的那個(gè)。
上一個(gè)代碼實(shí)現(xiàn):
int isqrt(unsigned x) {
unsigned x1;
int s, g0, g1;
if (x <= 1) return x;
s = 1;
x1 = x - 1;
if (x1 > 65535) {s = s + 8; x1 = x1 >> 16;}
if (x1 > 255) {s = s + 4; x1 = x1 >> 8;}
if (x1 > 15) {s = s + 2; x1 = x1 >> 4;}
if (x1 > 3) {s = s + 1;}
g0 = 1 << s; // g0 = 2**s.
g1 = (g0 + (x >> s)) >> 1; // g1 = (g0 + x/g0)/2.
while (g1 < g0) { // Do while approximations
g0 = g1; // strictly decrease.
g1 = (g0 + (x/g0)) >> 1;
}
return g0;
}
待續(xù)...