主题:[原创]用JavaScript算圆周率
搜JavaScript特效,看到有一个是算圆周周率的,可是有效位并不高,而且慢。下面这个是我自己编的,把下面文本保存成HTM文件,在IE中打开可以算出圆周率的小数点后一千位。
<script language = "javascript">
<!--
// pi = 16acrtg(1/5)-4arctg(1/239)
// pi/4 = 1/1*(20/25-239/57121)-1/3(20/25^2-239/57121^2)+...
// Programmed by j.t.Chang.
var dn = 253 ; // Array length.
var i, ip, c ;
var sum = new Array(dn+1);
var a = new Array(dn+1);
var b = new Array(dn+1);
function oupt()
{ var i, s, j, k ;
document.write("PI = ");
document.write(sum[1],".<br>");
for(i = 2;i<= dn;i++)
{ s = ""+sum[i];
k = s.length;
for(j = 1;j <= 4-k; j++) s = "0" + s;
document.writeln(s);
}
document.write("<br><br>Digits: ",(dn-1)*4);
}
function m_div(k)
{ var i,r1,c = 0;
for(i = ip;i <= dn;i++)
{ r1 = c*10000+a[i];
c = r1%k;
a[i]= (r1-c)/k;
}
}
function m_div2(k)
{ var i,r1,c = 0;
for(i = ip;i <= dn;i++)
{ r1 = c*10000+a[i];
c = r1%k;
b[i] = (r1-c)/k;
}
}
function s_add()
{ var i,r1,c = 0;
for(i = dn;i >= ip;i--)
{ r1 = c+b[i]+sum[i];
if(r1 > 9999)
{ sum[i] = r1-10000;
c = 1;
}
else { sum[i] = r1;
c = 0;
}
}
if(c == 0) return;
i = ip-1;
while(c > 0)
{ if (i == 1)
{ sum[1] += c;
return;
}
else { r1 = c+sum[i];
if(r1 > 9999) { sum[i] = r1-10000;
c = 1;
}
else{ sum[i] = r1;
c = 0;
}
}
i--;
}
}
function s_sub()
{ var i, r1, c = 0;
for(i = dn;i >= ip; i--)
{ r1 = c-b[i]+sum[i];
if(r1 < 0) { sum[i] = r1+10000;
c = -1;
}
else{ sum[i] = r1;
c = 0;
}
}
if(c == 0) return;
i = ip-1;
while(c < 0) {
if(i == 1) { sum[1] += c;
return;
}
else{ r1 = c+sum[i];
if(r1 < 0) { sum[i] = r1+10000;
c = -1;
}
else{ sum[i] = r1;
c = 0;
}
}
i--;
}
}
function proc()
{ var r1, c = 0, i;
for(i = dn;i >= 1; i--)
{ r1 = c+sum[i]*4;
if(r1 > 9999)
{ sum[i] = r1%10000;
c = (r1 - sum[i])/10000;
}
else{ sum[i] = r1;
c = 0;
}
}
}
for(i = 1;i <= dn;i++)
sum[i] = a[i] = b[i] = 0;
a[1] = 20;
k = ip = c = 1;
do{ i = ip;
stop = false;
while(a[i] == 0)
if( ++i > dn)
{ stop = true;
break;
}
if(stop) break;
ip = i;
m_div(25);
m_div2(k);
if(c == 1) s_add();
else s_sub();
k += 2;
c = -c;
} while(true);
for(i = 1;i <= dn;i++) a[i] = b[i] = 0;
a[1] = b[1] = 239;
k = ip = 1;
c = -1;
do{ i = ip;
stop = false;
while(a[i] == 0)
if(++i > dn)
{ stop = true;
break;
}
if(stop) break;
ip = i;
m_div(57121);
m_div2(k);
if(c == 1) s_add();
else s_sub();
k += 2;
c = -c;
} while(true);
proc();
oupt();
//-->
</script>
<script language = "javascript">
<!--
// pi = 16acrtg(1/5)-4arctg(1/239)
// pi/4 = 1/1*(20/25-239/57121)-1/3(20/25^2-239/57121^2)+...
// Programmed by j.t.Chang.
var dn = 253 ; // Array length.
var i, ip, c ;
var sum = new Array(dn+1);
var a = new Array(dn+1);
var b = new Array(dn+1);
function oupt()
{ var i, s, j, k ;
document.write("PI = ");
document.write(sum[1],".<br>");
for(i = 2;i<= dn;i++)
{ s = ""+sum[i];
k = s.length;
for(j = 1;j <= 4-k; j++) s = "0" + s;
document.writeln(s);
}
document.write("<br><br>Digits: ",(dn-1)*4);
}
function m_div(k)
{ var i,r1,c = 0;
for(i = ip;i <= dn;i++)
{ r1 = c*10000+a[i];
c = r1%k;
a[i]= (r1-c)/k;
}
}
function m_div2(k)
{ var i,r1,c = 0;
for(i = ip;i <= dn;i++)
{ r1 = c*10000+a[i];
c = r1%k;
b[i] = (r1-c)/k;
}
}
function s_add()
{ var i,r1,c = 0;
for(i = dn;i >= ip;i--)
{ r1 = c+b[i]+sum[i];
if(r1 > 9999)
{ sum[i] = r1-10000;
c = 1;
}
else { sum[i] = r1;
c = 0;
}
}
if(c == 0) return;
i = ip-1;
while(c > 0)
{ if (i == 1)
{ sum[1] += c;
return;
}
else { r1 = c+sum[i];
if(r1 > 9999) { sum[i] = r1-10000;
c = 1;
}
else{ sum[i] = r1;
c = 0;
}
}
i--;
}
}
function s_sub()
{ var i, r1, c = 0;
for(i = dn;i >= ip; i--)
{ r1 = c-b[i]+sum[i];
if(r1 < 0) { sum[i] = r1+10000;
c = -1;
}
else{ sum[i] = r1;
c = 0;
}
}
if(c == 0) return;
i = ip-1;
while(c < 0) {
if(i == 1) { sum[1] += c;
return;
}
else{ r1 = c+sum[i];
if(r1 < 0) { sum[i] = r1+10000;
c = -1;
}
else{ sum[i] = r1;
c = 0;
}
}
i--;
}
}
function proc()
{ var r1, c = 0, i;
for(i = dn;i >= 1; i--)
{ r1 = c+sum[i]*4;
if(r1 > 9999)
{ sum[i] = r1%10000;
c = (r1 - sum[i])/10000;
}
else{ sum[i] = r1;
c = 0;
}
}
}
for(i = 1;i <= dn;i++)
sum[i] = a[i] = b[i] = 0;
a[1] = 20;
k = ip = c = 1;
do{ i = ip;
stop = false;
while(a[i] == 0)
if( ++i > dn)
{ stop = true;
break;
}
if(stop) break;
ip = i;
m_div(25);
m_div2(k);
if(c == 1) s_add();
else s_sub();
k += 2;
c = -c;
} while(true);
for(i = 1;i <= dn;i++) a[i] = b[i] = 0;
a[1] = b[1] = 239;
k = ip = 1;
c = -1;
do{ i = ip;
stop = false;
while(a[i] == 0)
if(++i > dn)
{ stop = true;
break;
}
if(stop) break;
ip = i;
m_div(57121);
m_div2(k);
if(c == 1) s_add();
else s_sub();
k += 2;
c = -c;
} while(true);
proc();
oupt();
//-->
</script>

您所在位置: