收录日期:2019/04/20 16:44:17 时间:2016/05/31 09:33:48 标签:JavaScript
怎么用JavaScript计算圆周率PI ?
曾经在哪儿看到过一个算法的,现在找不到了。
用得着你去计算吗?

直接字符串,想有多少位去抄多少位

真是服了
Math.PI
<HTML>
<HEAD>
<META NAME="keywords" CONTENT="Pi, machin, javascipt, numerical methods, multiple precision, series">
<SCRIPT LANGUAGE="JavaScript">
<!-- 
//
//  arctangent series for Pi a la mode by Bohr
//
var vectorsize = 53;          // number of elements in each of four arrays 
var nCells = 52;              // number of array elements displayed

// constant
var BASE = 10000.0;           // The number base 
var TENTHOUSANDTH = 0.0001;   // avoids floating point division 
var SQ_239E4 = 571210000.0;   // = BASE x 239 squared 
var SQ_5E4 = 250000.0;        // = BASE x 5 squared
var REPAIR = 0.000005;        // roundoff correction 
var RECIPR_25 = 0.04;         // the reciprocal of 25 is 0.04 
var RECIPR_239= 1.0 / 57121;  // reciprocal of 239 squared

// arrays
var term5 = null;             // = (1/5)^(2n+1), integer array
var term239 = null;           // = (1/239)^(2n+1), integer array
var sum = null;               // = 16term5-4term239, integer array
var series = null;            // = PI

// floating or integer
var TwoNplus1 = 1.0;          // 2n+1 = 1,3,5,7,... 
var Basex2n_1 = BASE;         // = 10000*(2n+1)  
var Currdigit = 1;            // index of the series[] element being printed 
var sgn = 1;                  // = (-1)^n; takes the values -1 and 1 

// strings
var IntroString = " Pi = 3.";

function MakeArray(n) {
   this.length = n;
   for (var i = 1; i <= n; i++) {
       this[i] = 0;
   }
   return this;
}
function PiSetup() {
   term5   = new MakeArray(vectorsize);
   term239 = new MakeArray(vectorsize);
   sum     = new MakeArray(vectorsize);
   series  = new MakeArray(vectorsize);

   term5[1] = 5;
   term239[1] = 239;
}
function DivideTerms() {
    var total5 = term5[1];
    var total239 = term239[1];

    // Divide the terms by 25 or 57121
    for (var i = Currdigit; i <= nCells + 2; i++) {
        term5[i] = Math.floor( RECIPR_25 * total5 + REPAIR );
        total5 = BASE * total5 - SQ_5E4 * term5[i] + term5[i+1];
        term239[i] = Math.floor( total239 * RECIPR_239 + REPAIR );
        total239 = BASE * total239 - SQ_239E4 * term239[i] + term239[i+1];
    }
}
function SubtractTerms() {
    var carry = 0;
    var total = 0;

    for (var i = nCells + 1; i > Currdigit; i--) {
        total = 16.0 * term5[i] - 4.0 * term239[i] + carry + 60000.0;
        carry = Math.floor( total * TENTHOUSANDTH + REPAIR ) - 6.0;
        sum[i] = Math.floor( total - BASE * carry - 60000.0 );
    }
}
function DivideSum() {
    var total = sum[1];
    var reciprocal = 1.0 / TwoNplus1;

    for( var i = Currdigit; i <= nCells + 2; i++) {
        sum[i] = Math.floor( total * reciprocal + REPAIR );
        total = BASE * total - Basex2n_1 * sum[i] + sum[i+1];
    }
}
function AddShowDigits(nchars,lwidth) {
    var i = 0;
    var total = 0;
    var carry = 0;
    var ccount = nchars / 4;
    var strg = "x";
    var old1 = series[Currdigit+1];
    var old2 = series[Currdigit+2];

    // Add the sum to the series 
    for (i = nCells + 1; i >= Currdigit; i--) {
        total = series[i] + sgn * sum[i] + carry + 30000.0;
        carry = Math.floor( total * TENTHOUSANDTH + REPAIR ) - 3.0;
        series[i] = Math.floor( total - BASE * carry - 30000.0 );
    } 

    // if stable, display digits
    if((old1==series[Currdigit+1]) && (old2==series[Currdigit+2])) {
        Currdigit++;
        ccount++;
        if (ccount > lwidth / 4) {
            document.write("<BR>")
            ccount = 1;
        }
        strg = (BASE + series[Currdigit]) + " ";
        document.write(strg.substring(1,5))
    }

    return (4 * ccount);
}

function Crunch(fontname,fontsize) { 
    var linelength = IntroString.length;
    var time0 = new Date();
    var linewidth = 4 * Math.floor(50.0 / fontsize)

    window.status = ".. calculating "+(4 * nCells)+" digits, please wait .."
    document.write('<UL><FONT SIZE=' + fontsize + ' FACE="' + fontname + '">')
    document.write(IntroString)

    while (Currdigit < nCells) {
        DivideTerms()
        SubtractTerms()
        DivideSum()
        linelength = AddShowDigits(linelength, linewidth)

        // Set up the next value of n 
        TwoNplus1 += 2.0;  
        Basex2n_1 = BASE * TwoNplus1;
        sgn = 0 - sgn;
    }

    var time1 = new Date();
    var elapsed = time1.getTime() - time0.getTime();
    document.write("</FONT>")
    document.write("<BR><BR><B>" + (4 * nCells) + " digits calculated in ")
    document.write((Math.floor(elapsed)/1000.0) + " seconds.</B>")
    document.write("</UL>")
}

PiSetup()

// -->
</SCRIPT>
</HEAD>

<BOD>
<br>

<CENTER>
<B><FONT SIZE=+1>Machin's Arctangent Series for Pi in JavaScript</FONT></B>
</CENTER>
<hr>

<SCRIPT LANGUAGE="JavaScript">
<!--
    Crunch("Courier New", 4)
// -->
</SCRIPT>

</BODY>
</HTML>
Math.PI
js浮点很弱的,能计算出来都不准确
按cuixiping(无心) 贴的,算出:

Machin's Arctangent Series for Pi in JavaScript 
--------------------------------------------------------------------------------
Pi = 3.1415926535897932384626433832795028841971
693993751058209749445923078164062862089986280348
253421170679821480865132823066470938446095505822
317253594081284811174502841027019385211055596446
22948954930381964428

208 digits calculated in 0.188 seconds.


好像是这么回事。

紧急救命!问什么索引会搞到死锁,严重超时! asp如何远程调用远端服务器上的asp? 今天公司的GOOGLE上不去了,上不去的就进来留个名,顺便把地名也留一下... 请问如何使用滚动条CScrollBar去替代CListBox中的滚动条? 问个简单的xml的问题,懂的朋友进来帮个忙。 最近比較煩,不知是沒有找對公司,還是vfp程序員只有這樣的待遇? 如果发信人等于收信人,就把此邮件自动移动到某个文件夹,怎么实现? 中国应该以人质事件为契机,出兵伊拉克 求mysql某行数据定时置为零 关于OSI的第五层session层,请大侠帮忙...... 将一个recordset保存成.hta格式后,怎么让它运行时最小化?或者在后台运行? 如何从ADOConnection中得到所连接的服务器的名称? 怎样操作,才能让宏在一个Excel表中的一个sheet中运行而其它的sheet不运行? 请问如何使用滚动条CScrollBar去替代CListBox中的滚动条? fastreport ,莫见笑 MSDE 联接问题:为什么MSDE在Windows 2000 下安装上之后,windows XP 不能联接,但在Windows XP 下安装后,而Windows 2000确可以联 怎么得到一个目录下的所有文件名了?? 求windows2003 + vc6.0(汉化版本) 环境下能用的 Visual Assist (6.0 、X、10.*都可以) 求助 请教几年来使用数据窗口的一些疑难问题? 谁能发一份有关OA系统用网站的详细设计给我。马上送100分. 树型菜单的JS代码,急用200分相送 关于WIN2000的更高安全权限~~ 才知道如何查看自己帖子的被关注程度。 那位大哥or大姐有在程序中编译.C文件的经验帮帮看看!! 邮件损坏会导致http挂起 VC~~~~~~~~~~~~~~~~~~~~~~~~~高手过超 怎么在WAS中取得WPS(或WAS)的用户登录名 请教菜单中“最近打开文件”的显示和应用方面的问题 请问大侠