搜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>