from http://blog.csdn.net/redleaves/archive/2003/06/06/6449.aspx
1.b=a/2;
while (abs(b*b-a)>e) // e为一个很小的数,指明了算法的精度
b=(b+a/b)/2;
2.
条件:N(N+2*Q*R) <=Y
n进制时,Q=n;R为上一次的结果;N为要试的满足条件的最大的值;Y为计算到这时的余数
(注意:补位时要看进制,如果为10进制,则应补100,即10*10;二进制时应补4,即2*2)
例1:10开方根(10进制)
sqrt(10)=3.1622776601683793319988935444327
3. 1 6 2
)10
9 <=N(N+2*Q*R)=3*(3+2*10*0)=9<10 上 3
1 00
61 <=N(N+2*Q*R)=1*(1+2*10*3)=61<100 上 1
39 00
37 56 <=N(N+2*Q*R)=6*(6+2*10*31)=3756<3900 上 6
1 44 00
1 26 44 <=N(N+2*Q*R)=2*(2+2*10*316)=12644<14400 上 2
17 56
....
....
例2:10开方根(2进制)
N(N+2*Q*R)
由于:
N=0或1
Q=2
R=未知
所以:
N(N+2*Q*R) <=> R<<2+1
(10)D=(1010)B
sqrt(10)=(3.1622776601683793319988935444327)D=(0011.0010 1001 1000)B
1 1. 0 0 1 0
)10 10
1 <=R<<2+1=0<<2+1=0+1=1<10 上 1
1 10
1 01 <=R<<2+1=1<<2+1=100+1=101<110 上 1
1 00
0 <=R<<2+1=11<<2+1=1100+1=1101>100 上 0
1 00 00
0 <=R<<2+1=110<<2+1=11000+1=11001>10000 上 0
1 00 00 00
11 00 01 <=R<<2+1=1100<<2+1=110000+1=110001<1000000 上 1
11 11
......
附matlab test code:
%//算法1
a=1000000;
b=a/2;
i=0;
while (abs(b*b-a)>1e-5) %// e为一个很小的数,指明了算法的精度
b=(b+a/b)/2;
i=i+1;
end
a^.5-b
i
else
%//算法2
Y=20;
R=0;
Q=10;
Bei=1;
for i=1:10
N=0;
while N*(N+2*Q*R)<=Y & N<10
N=N+1;
end
N=N-1;
if N<0 | N>9,N,error;end
i
Y=(Y-N*(N+2*Q*R))*100 %//余数
R=R*10+N %//平方根
Bei=10^(i-1)
end
end