JS计算圆周率到小数点后100位实现步骤详解

这次给大家带来JS计算圆周率小数点后100位实现步骤详解,JS计算圆周率到小数点后100位的注意事项有哪些,下面就是实战案例,一起来看一下。

浮点数的有效数位是16位,我自己做了一个大数类,能存储100位有效数位,并实现了大数类的基本运算。我用它来计算圆周率(割圆法,即多边形逼近),得到了小数点后一百位有效数字,比对了Machin 公式的计算结果,没有误差。用时约2秒。

完整示例如下:

js计算圆周率<!--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 ) -- 乘法。         pide( BigNum num ) -- 除法。         SquareRoot() -- 平方根。         toString() -- 转换为字符串(包括小数点),以便以文本形式输出计算结果。         Clone() -- 复制。  */  this.recalc = function() /* 去除前缀的 0,并重新计算小数点位置 */  {    for(var i = 0; i  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 = 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 = 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  num.data[i])           {              num1 = this;              num2 = num;              bPositive = this.positive;              break;           }           else if(this.data[i] = 17)         {           var result = new BigNum("", 0, bPositive);           for(var i = 0; 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.pide = 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 = 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])         {           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 = 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 = 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 ) ? "." : "" ) +          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.pide( 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 

登录后复制

运行结果:

3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

JS调用本地摄像头功能步骤详解

JS累加、迭代、穷举、递归等常用算法使用总结

以上就是JS计算圆周率到小数点后100位实现步骤详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2759185.html

(0)
上一篇 2025年3月8日 08:23:43
下一篇 2025年2月23日 10:50:00

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Vue.js实现微信公众号菜单编辑器步骤详解(上)

    这次给大家带来Vue.js实现微信公众号菜单编辑器步骤详解(上),Vue.js实现微信公众号菜单编辑器的注意事项有哪些,下面就是实战案例,一起来看一下。 学习一段时间Vue.js,于是想尝试着做一个像微信平台里那样的菜单编辑器,在这里分享下…

    2025年3月8日
    200
  • Vue.js实现微信公众号菜单编辑器步骤详解(下)

    这次给大家带来Vue.js实现微信公众号菜单编辑器步骤详解(下),Vue.js实现微信公众号菜单编辑器的注意事项有哪些,下面就是实战案例,一起来看一下。 实现菜单删除方法 在vue实例中添加删除菜单方法,根据选中的菜单级别和索引来删除。 m…

    2025年3月8日
    200
  • 使用vue.js实现编辑菜谱

    这次给大家带来使用vue.js实现编辑菜谱,使用vue.js实现编辑菜谱的注意事项有哪些,下面就是实战案例,一起来看一下。 1、先获取门店下的所有菜品类型、菜品名称、菜品id(list),也就是最大数据量 this.$http.post(c…

    2025年3月8日
    200
  • JS实现简单购物车功能代码分析

    这次给大家带来JS实现简单购物车功能代码分析,JS实现简单购物车功能的注意事项有哪些,下面就是实战案例,一起来看一下。 我们肯定都很熟悉商品购物车这一功能,每当我们在某宝某东上购买商品的时候,看中了哪件商品,就会加入购物车中,最后结算。购物…

    2025年3月8日 编程技术
    200
  • 使用原生ajax处理json字符串的方法

    json的全称是 javascript object notation(javascript对象表示法),是基于javascript对象字面量。这篇文章主要介绍了使用原生ajax处理json字符串的相关资料,需要的朋友可以参考下 AJAX …

    2025年3月8日
    200
  • angularjs实现购物金额计算代码分析

    这次给大家带来angularjs实现购物金额计算代码分析,angularjs实现购物金额计算的注意事项有哪些,下面就是实战案例,一起来看一下。 当我们用js或者jquery进行购物车金额计算的时候会非常麻烦,今天,我们用angularjs一…

    2025年3月8日
    200
  • JS怎么实现数组去重算法

    这次给大家带来JS怎么实现数组去重算法,JS实现数组去重算法的注意事项有哪些,下面就是实战案例,一起来看一下。 测试用例: arr = [“1″,3,”1″,1,4,5,1,”2&…

    编程技术 2025年3月8日
    200
  • JS怎么求得最小公倍数和最大公约数

    这次给大家带来JS怎么求得最小公倍数和最大公约数,JS求得最小公倍数和最大公约数的注意事项有哪些,下面就是实战案例,一起来看一下。 方法来自求多个数最小公倍数的一种变换算法(详见附录说明) 最小公倍数的算法由最大公约数转化而来。最大公约数可…

    编程技术 2025年3月8日
    200
  • 怎样用JS实现DOM树遍历

    这次给大家带来怎样用JS实现DOM树遍历,JS实现DOM树遍历的注意事项有哪些,下面就是实战案例,一起来看一下。 二叉 DOM 树的遍历 function Tree() { var Node = function(key){ this.ke…

    编程技术 2025年3月8日
    200
  • 怎样用JS跨域实现POST

    这次给大家带来怎样用JS跨域实现POST,JS跨域实现POST的注意事项有哪些,下面就是实战案例,一起来看一下。 javascript 跨域是一个很常见的问题,其中 jsonp 是一个最常用的手段,但是 jsonp 只支持 get,不支持 …

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论