国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

JavaScript實現計算圓周率到小數點后100位的方法示例

2024-05-06 15:34:30
字體:
來源:轉載
供稿:網友

本文實例講述了JavaScript實現計算圓周率到小數點后100位的方法。分享給大家供大家參考,具體如下:

浮點數的有效數位是16位,我自己做了一個大數類,能存儲100位有效數位,并實現了大數類的基本運算。我用它來計算圓周率(割圓法,即多邊形逼近),得到了小數點后一百位有效數字,比對了Machin 公式的計算結果,沒有誤差。用時約2秒。

完整示例如下:

<!DOCTYPE html><html><head><meta charset="utf-8"><title>www.survivalescaperooms.com js計算圓周率</title></head><body><script><!--function BigNum(str, n, b){  /*   BigNum -- 大數類   私有成員:         data -- 119 位數字,放在長度為 17 的數組里,每個數組元素存放 7 位數字。         decimal_place -- 小數點的位置,從最左位開始算。         positive -- 是否是正數。         recalc() -- 為了盡可能存放最多的有效數位,去除前綴的 0,并重新計算小數點位置。         init() -- 部分初始化工作。   公有成員:         BigNum( String str, INT n, BOOL b) --              構造函數。參數:str -- 字符串,各個有效數位;n -- 整數,小數點位置,從最左位開始算,比如 BigNum("123", 2) = 12.3; BigNum("123", 0) = 0.123; BigNum("123", -2) = 0.00123;b -- 布爾值,是否是正數。         Add( BigNum num ) -- 加法。         Subtract( BigNum num ) -- 減法。         Multiply( BigNum num ) -- 乘法。         Divide( BigNum num ) -- 除法。         SquareRoot() -- 平方根。         toString() -- 轉換為字符串(包括小數點),以便以文本形式輸出計算結果。         Clone() -- 復制。  */  this.recalc = function() /* 去除前綴的 0,并重新計算小數點位置 */  {    for(var i = 0; i < 17; i ++)    {       if(this.data[0] != 0) break;       this.data.shift();       this.data.push(0);       this.decimal_place --;    }  }  this.init = function() /* 部分初始化工作 */  {    this.decimal_place = Math.ceil( n / 7 ); //小數點位置    this.data = new Array(17); //保存有效數位的數組    if(n % 7 > 0)    {       var arr = new Array( 8 - n % 7 );    }    else    {       var arr = new Array( 1 - n % 7 );    }    str = arr.join("0") + str;    if(str.length > 119)    {       str = str.substr(0, 119);    }    else if(str.length < 119)    {       var arr = new Array(120 - str.length);       str += arr.join("0");    }    for( var i = 0; i < 17; i ++ )    {       this.data[i] = parseInt( str.substr(i * 7, 7) , 10 );    }  }  /* 初始化開始 */  this.positive = b;  if( ! /^0*$/.test(str) )  {    this.init();    this.recalc();  }  else  {    this.data = new Array(17);    for( var i = 0; i < 17; i ++ )    {       this.data[i] = 0;    }    this.decimal_place = 0;  }  /* 初始化結束 */  this.Add = function(num) /* 加法 */  {    if(this.positive && !num.positive)    {       num.positive = true;       var result = this.Subtract(num);       num.positive = false;       return result;    }    else if(num.positive && !this.positive)    {       this.positive = true;       var result = num.Subtract(this);       this.positive = false;       return result;    }    var result = new BigNum("", 0, this.positive);    var num1,num2;    if(this.decimal_place >= num.decimal_place)    {       num1 = this;       num2 = num;    }    else    {       num1 = num;       num2 = this;    }    result.decimal_place = num1.decimal_place;    if(num1.decimal_place - num2.decimal_place >= 17)    {       for(var i = 0; i < 17; i ++)       {         result.data[i] = num1.data[i];       }       return result;    }    var nOffDec = num1.decimal_place - num2.decimal_place;    var nTmp = 0;    for( var i = 16; i >= 0; i -- )    {       var nTmp1 = i - nOffDec;       var nTmp2 = 0;       if(nTmp1 >= 0)       {         nTmp2 = num1.data[i] + num2.data[nTmp1];       }       else       {         nTmp2 = num1.data[i];       }       nTmp2 += nTmp;       nTmp = Math.floor(nTmp2 / 10000000);       result.data[i] = nTmp2 % 10000000;    }    if(nTmp > 0)    {       result.data.unshift(nTmp);       result.decimal_place ++;    }    return result;  }  this.Subtract = function(num) /* 減法 */  {    if(this.positive && !num.positive)    {       num.positive = true;       var result = this.Add(num);       num.positive = false;       return result;    }    else if(!this.positive && num.positive)    {       this.positive = true;       var result = this.Add(num);       result.positive = false;       this.positive = false;       return result;    }    else    {       var num1 = num2 = null;       var bPositive;       if(this.decimal_place > num.decimal_place)       {         num1 = this;         num2 = num;         bPositive = this.positive;       }       else if(this.decimal_place < num.decimal_place)       {         num1 = num;         num2 = this;         bPositive = !this.positive;       }       else       {         for( var i = 0; i < 17; i ++ )         {           if(this.data[i] > num.data[i])           {              num1 = this;              num2 = num;              bPositive = this.positive;              break;           }           else if(this.data[i] < num.data[i])           {              num1 = num;              num2 = this;              bPositive = !this.positive;              break;           }         }       }       if( num1 == null)       {         return new BigNum("", 0, true);       }       else       {         if(num1.decimal_place - num2.decimal_place >= 17)         {           var result = new BigNum("", 0, bPositive);           for(var i = 0; i < 17; i ++)           {              result.data[i] = num1.data[i];           }           result.decimal_place = num1.decimal_place;           return result;         }         var result = new BigNum("", 0, bPositive);         result.decimal_place = num1.decimal_place;         var nOffDec = num1.decimal_place - num2.decimal_place;         var nTmp = 0;         for( var i = 16; i >= 0; i -- )         {           var nTmp1 = i - nOffDec;           var nTmp2 = 0;           if(nTmp1 >= 0)           {              nTmp2 = 10000000 + nTmp + num1.data[i] - num2.data[nTmp1];           }           else           {              nTmp2 = 10000000 + nTmp + num1.data[i];           }           if(nTmp2 >= 10000000)           {              result.data[i] = nTmp2 - 10000000;              nTmp = 0;           }           else           {              result.data[i] = nTmp2;              nTmp = -1;           }         }         result.recalc();         return result;       }    }  }  this.Multiply = function(num) /* 乘法 */  {    var bPositive;    var nDecimalPlace = this.decimal_place + num.decimal_place - 1;    if(this.positive == num.positive)    {       bPositive = true;    }    else    {       bPositive = false;    }    var result = new BigNum("", 0, bPositive);    var nTmpData = 0;    for( var i = 16; i >= 0; i -- )    {       for( var j = 16; j >= 0; j -- )       {         if(isNaN(result.data[j + i]))           result.data[j + i] = 0;         result.data[j + i] += this.data[j] * num.data[i];         if(result.data[j + i] >= 10000000)         {           if( j + i -1 >= 0 )           {              result.data[j + i -1] += Math.floor(result.data[j + i] / 10000000);           }           else           {              nTmpData += Math.floor(result.data[j + i] / 10000000);           }           result.data[j + i] = result.data[j + i] % 10000000;         }       }    }    if(nTmpData > 0)    {       result.data.unshift(nTmpData);       result.data.pop();       nDecimalPlace ++;    }    result.decimal_place += nDecimalPlace;    return result;  }  this.Divide = function(num) /* 除法 */  {    var bPositive;    var nDecimalPlace = this.decimal_place - num.decimal_place + 1;    if(this.positive == num.positive)    {       bPositive = true;    }    else    {       bPositive = false;    }    var result = new BigNum("", 0, bPositive);    var arrTemp = new Array(17);    for( var i = 0; i < 17; i ++ )    {       arrTemp[i] = this.data[i];    }    var bTest = true;    var nTest = 0;    for( var i = 0; i < 17; i ++ )    {       if(bTest)       {         nTest = Math.floor( ( arrTemp[0] * 10000000 + arrTemp[1] ) / ( num.data[0] * 10000000 + num.data[1] ) );       }       else       {         bTest = true;       }       if(nTest == 0)       {         result.data[i] = 0;         arrTemp[1] += arrTemp[0] * 10000000;         arrTemp.shift();         arrTemp.push(0);         continue;       }       var arrTemp1 = new Array(17);       for( var j = 0; j < 17; j ++ )       {         arrTemp1[j] = 0;       }       for( var j = 16; j >= 0; j -- )       {         arrTemp1[j] += nTest * num.data[j];         if(arrTemp1[j] >= 10000000)         {           if(j != 0)           {              arrTemp1[j - 1] += Math.floor( arrTemp1[j] / 10000000);              arrTemp1[j] = arrTemp1[j] % 10000000;           }         }       }       for( var j = 0; j < 17; j ++ )       {         if(arrTemp[j] < arrTemp1[j])         {           bTest = false;           break;         }         else if(arrTemp[j] > arrTemp1[j])         {           break;         }       }       if(bTest)       {         result.data[i] = nTest;         for( var j = 16; j >= 0; j -- )         {           if(arrTemp[j] >= arrTemp1[j])           {              arrTemp[j] -= arrTemp1[j];           }           else           {              arrTemp[j] = 10000000 + arrTemp[j] - arrTemp1[j];              arrTemp[j - 1] --;           }         }       }       else       {         nTest --;         i --;         continue;       }       arrTemp[1] += arrTemp[0] * 10000000;       arrTemp.shift();       arrTemp.push(0);    }    result.decimal_place = nDecimalPlace;    result.recalc();    return result;  }  this.SquareRoot = function() /* 平方根 */  {    var result = new BigNum("", 0, true);    nDecimalPlace = Math.ceil(this.decimal_place / 2);    var arrTemp = new Array(17);    for(var i = 0; i < 17; i ++)    {       arrTemp[i] = this.data[i];    }    var bTest = true;    for(var i = 0; i < 17; i ++)    {       if( i == 0 )       {         if(this.decimal_place % 2 == 0)         {           var nTemp = arrTemp[0] * 10000000 + arrTemp[1];           var nTemp1 = Math.floor( Math.sqrt( nTemp ) );           var nTemp2 = nTemp - nTemp1 * nTemp1;           arrTemp[0] = 0;           arrTemp[1] = nTemp2;           arrTemp.shift();           arrTemp.push(0);         }         else         {           var nTemp1 = Math.floor( Math.sqrt( arrTemp[0] ) );           var nTemp2 = arrTemp[0] - nTemp1 * nTemp1;           arrTemp[0] = nTemp2;         }       }       else       {         if(bTest)         {           if( i == 1 )           {              nTemp1 = Math.sqrt( (arrTemp[0] * 10000000 + arrTemp[1]) + 100000000000000 * Math.pow(result.data[0], 2) ) - 10000000 * result.data[0];              nTemp1 = Math.floor(nTemp1);           }           else           {              nTemp = result.data[0] * 10000000 + result.data[1];              nTemp1 = Math.floor( ( arrTemp[0] * 10000000 + arrTemp[1] ) / ( 2 * nTemp ) );           }         }         else         {           bTest = true;         }         var arrTemp1 = new Array(17);         var nTemp3 = 0         for( var j = i - 1; j >= 0; j -- )         {           arrTemp1[j] = result.data[j] * 2 + nTemp3;           if( arrTemp1[j] >= 10000000 && j > 0 )           {              nTemp3 = 1;              arrTemp1[j] = arrTemp1[j] % 10000000;           }           else           {              nTemp3 = 0;           }         }         arrTemp1[i] = nTemp1;         nTemp3 = 0;         for( var j = i; j >= 0; j -- )         {           arrTemp1[j] = arrTemp1[j] * nTemp1 + nTemp3;           if( arrTemp1[j] >= 10000000 && j > 0 )           {              nTemp3 = Math.floor( arrTemp1[j] / 10000000 );              arrTemp1[j] = arrTemp1[j] % 10000000;           }           else           {              nTemp3 = 0;           }         }         var arrTemp2 = new Array(17);         for( var j = 0; j < 17; j ++ )         {           arrTemp2[j] = arrTemp[j];         }         for( var j = i; j >= 0; j -- )         {           if( arrTemp2[j] >= arrTemp1[j] )           {              arrTemp2[j] -= arrTemp1[j];           }           else           {              if(j > 0)              {                arrTemp2[j] = arrTemp2[j] + 10000000 - arrTemp1[j];                arrTemp2[j - 1] --;              }              else              {                bTest = false;                break;              }           }         }         if(bTest)         {           arrTemp = arrTemp2;         }         else         {           nTemp1 --;           i --;           continue;         }       }       result.data[i] = nTemp1;       arrTemp[1] += arrTemp[0] * 10000000;       arrTemp.shift();       arrTemp.push(0);    }    result.decimal_place = nDecimalPlace;    result.recalc();    return result;  }  this.toString = function() /* 轉換為字符串(包括小數點),以便以文本形式輸出計算結果 */  {    var szData = "";    var szOutPut = "";    this.recalc();    for( var i = 0; i < 17; i ++ )    {       var szTmpData = this.data[i].toString()       var arr = new Array(8 - szTmpData.length);       szData += arr.join("0") + szTmpData;    }    if( /^0*$/.test(szData) )    {       return "0";    }    var n = this.decimal_place * 7;    for(var i = 0; i < 7; i++)    {       if(szData.substr(i, 1) != 0) break;       n --;    }    szData = szData.replace(/^0+/g,"");    szData = szData.substr(0, 101);    szData = szData.replace(/0+$/g,"");    if( n < 1 )    {       szOutPut = szData.substr(0, 1) +          ( ( szData.length > 1 ) ? "." : "" ) +          szData.substr(1) + "e" + ( n - 1 ).toString();    }    else if(n == szData.length)    {       szOutPut = szData;    }    else if(n > szData.length)    {       szOutPut = szData.substr(0, 1) + "." + szData.substr(1) + "e+" + (n - 1).toString();    }    else    {       szOutPut = szData.substr(0, n) + "." + szData.substr(n);    }    return ( this.positive ? "" : "-" ) + szOutPut;  }  this.Clone = function()   /* 復制 */  {    var result = new BigNum("", 0, true);    for( var i = 0; i < 17; i ++)    {       result.data[i] = this.data[i];    }    result.decimal_place = this.decimal_place;    result.positive = this.positive;    return result;  }}var a = new BigNum("1", 1, true)var count = 168;var nTwo = new BigNum("2", 1, true);function loop(intTmpvar,intCount){  if(intCount == 0) return intTmpvar;  var v1 = intTmpvar.Divide( nTwo );  var v11 = v1.Clone();  var nTemp = v1.Multiply( v11 );  var a1 = a.Clone();  a1 = a.Multiply(a1);  var nTemp1 = a1.Subtract( nTemp )  v2 = nTemp1.SquareRoot();  v3 = a.Subtract( v2 );  var v31 = v3.Clone();  var nTemp2 = v3.Multiply( v31 );  var nTemp3 = nTemp2.Add(nTemp);  v4 = nTemp3.SquareRoot();  return loop( v4 , -- intCount )}var a1 = a.Clone();var nTemp = a.Multiply(a1);var nTemp1 = nTemp.Clone();nTemp = nTemp.Add(nTemp1);nTemp = loop(nTemp.SquareRoot(), count);var nFour = new BigNum("4", 1, true);nTemp = nTemp.Multiply( nFour );nTemp1 = new BigNum("2", 1, true);var nTemp2 = new BigNum("2", 1, true);for(var i = 0; i < count - 1; i ++){  nTemp1 = nTemp1.Multiply( nTemp2 );}nTemp = nTemp.Multiply( nTemp1 );nTemp = nTemp.Divide( nTwo );nTemp = nTemp.Divide( a );document.write( nTemp )//--></script></body></html>            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 旬阳县| 平利县| 从江县| 旅游| 谢通门县| 蒲江县| 和顺县| 肥城市| 修文县| 航空| 保亭| 酉阳| 玛纳斯县| 土默特右旗| 敦化市| 德庆县| 北流市| 万荣县| 麻栗坡县| 嫩江县| 三原县| 铜鼓县| 永年县| 文成县| 秭归县| 黄陵县| 江达县| 美姑县| 涞源县| 河池市| 资中县| 东明县| 普定县| 牙克石市| 金堂县| 苏尼特左旗| 库尔勒市| 扎鲁特旗| 独山县| 洞口县| 崇文区|