作为一名计算机的初学者,因为老师作业的要求去完成圆周率的计算,因此突然产生了兴趣,想尝试自己用梅钦公式来完成这个任务。上网找了一些资料,也看见了短短几行就完成任务的代码,实在佩服,不过那样的代码实在对于我这个初学者来说太艰涩了,于是我自己大致了解了之后,自己完成了一遍,作为自己的第一次博客,来记录自己的思绪。

Machin公式:π=16arctan(1/5)-4arctan(1/239)

总体想法来说,是通过建立数组来储存超过类型范围的小数部分,这里我用long类型数组pi[ ]来储存各项(每一项有4位),使用long类型term[ ]来实现对每一次升幂结果的储存,之后通过进位等操作,实现用数组储存足够位数的π。

/***********************************************************使用梅钦公式π=16arctan(1/5)-4arctan(1/239)*通过建立数组来储存超过类型范围的小数部分*用long类型数组pi[ ]来储存各项(每一项有4位)*使用long类型term[ ]来实现对每一次泰勒展开结果的储存*之后通过进位等操作,实现用数组储存足够位数的π。         ***********************************************************/
void machin_pi(long L)
{//常量C用于进位退位操作,10000代表pi数组以四位进行储存const long C = 10000;//flag用于正负号的判定short flag;//梅钦公式具体应用时π=80*(1/25-1/(25*25*3)+......)+(-956)*(......)//xishu[]为两项展开的外系数,div[]为每次进阶指数所用的除数//odd为1,3,5等奇数,shang_1,r_1是进阶指数的商和余数,r_2是计算π各项的余数long xishu[2] = { 80,-956 }, div[2] = { 25,57121 },odd,shang_1, r_1, r_2,i=0,j,t,tt,k=0,len=L;L = L / 4 + 3;//term[]用来完成对每个升幂项的足够长度保存//pi[]用来储存最后结果long *term = new long[L];long *pi = new long[L];while (i < L)pi[i++] = 0;while (k - 2){//完成对term的初始化flag = 1;term[0] = xishu[k];i = 1;while (i < L){term[i] = 0;++i;}for (i = 0,odd=1; i < L; ++i){j = i;for (r_1=r_2 = 0;j < L; ++j){t = r_1 * C + term[j];                //t、r_1、term[]用来储存25与57121的各幂term[j] = t / div[k];                 //每次进阶都用上一轮已经算好的term数组进行升阶(后一项都是前一项除以25或57121)r_1 = t % div[k];                     //保存余数,在下一项中×C用于退位tt = r_2 * C + term[j];               //tt、r_2、shang_1用来储存泰勒展开各项shang_1 = tt / odd;                   //在term[]的基础上除以奇数1、3、5等r_2 = tt % odd;                       //保存余数,在下一项中用于退位pi[j] += (flag?shang_1:-shang_1);     //用flag进行标定正负号}if (term[i])--i;                          //当term[i]==0时,后续展开不会影响这一项(这四位小数),进行++i,直接从下一项开始odd += 2; flag=!flag;                               //泰勒展开正负号改变                               }++k;                                          //处理完arccot5后进入下一轮处理arccot239}k = 0;//上述循环之后,pi[]中已经储存了各项数据//但pi[]中数据可能存在负数、五位数及以上等等情况//接下来的循环进行处理,通过进位全部转化成正四位数while (--i){pi[i] += k;if (pi[i] < 0){k = pi[i] / C-1;pi[i] %= C;pi[i] += C;}else{k = pi[i] / C;pi[i] %= C;}}//输出圆周率printf("3.");for (i = 1; i < len / 4 + 1; ++i){printf("%04ld", pi[i]);}switch (len%4){case 0:break;case 1:printf("%01ld", pi[i]/ 1000); break;case 2:printf("%02ld", pi[i]/ 100); break;case 3:printf("%03ld", pi[i]/ 10); break;}//释放内存delete[] term;delete[] pi;
}

Machin(梅钦/马青)公式计算圆周率π相关推荐

  1. Python利用马青公式计算圆周率Π并写入文件

    一.什么是马青公式         马青公式由英国天文学教授约翰·马青(John Machin ,1686 –1751)于1706年发现,他利用这个公式计算到了100位的圆周率. 马青公式每计算一项可 ...

  2. 用马青公式计算圆周率,Python语言

    马青公式: 简单实现 import times_time = time.time() #定义计算的位数 num = 100000 #多计算10位,以防出错 num1 = num + 10 #定义计算小 ...

  3. c语言马青公式计算圆周率,数学圆周率计算马青公式π/4=4arctan1/5-arctan1/239如何得出的?...

    共回答了16个问题采纳率:87.5% 设 x = arctan A tan x = A tan 2x = (2 tan x) / (1 - tan^2 x) tan 2x = (2A) / (1 - ...

  4. 用马青公式计算π的c程序

    /*一个计算π的c程序 ====================================== 由于大多数计算机内置算法有一定精度限制,你想计算那么多位就会产生问题. 这里有一个c程序,允许计算 ...

  5. 【Python、数学】计算任意位数的圆周率π(马青公式)

    1. 公式准备 计算准确圆周率的马青公式: 对反正切进行级数展开: 就可以得到 π = 16(1/5 - 1/3/5^3 + 1/5/5^5 - ...) - 4(1/239 - 1/3/239^3 ...

  6. 利用Java的BigDecimal与马青公式精确计算π后10000位,

    首先给出公式如下: π=16arctan1/5−4arctan1/239: 即是 π=16×(1/(1×5)−1/(3×5的3次方)+1/(5×5的5次方)-)−4×(1/(1×239)−1/(3×2 ...

  7. 用Machin公式计算圆周率的源程序

    用Machin公式计算圆周率的源程序 /* Program to compute PI, by Jason Chen, May 1999 ** ** Open VC++ IDE, new a win3 ...

  8. 利用马青公式输出π的后任意位数字

    马青公式 π=16arctan15−4arctan1239π=16arctan15−4arctan1239\pi = 16arctan \frac{1}{5} - 4arctan \frac{1}{2 ...

  9. 根据公式计算圆周率Π的值

    根据公式计算圆周率的值 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 根据公式计算圆周率的值 前言 一.如何计算? 二.计算步骤 1.代码及注释 总结 前言 计算圆周率Π的近似值 ...

最新文章

  1. 脚手架koa2+mockjs
  2. oracle数据库相关知识,Oracle数据库相关知识点复习
  3. @cacheable 设置过期时间_缓存面试三连击——聊聊Redis过期策略?内存淘汰机制?再手写一个LRU 吧!...
  4. 【LeetCode笔记】309. 最佳买卖股票时机含冷冻期(Java、动态规划)
  5. Android Gradle实用技巧——APK文件名中加上SVN版本号,日期等
  6. JAVA加载JAR包并调用JAR包中某个类的某个方法
  7. 冒着被开除的风险也要给大家看看看这份Spring Cloud 总结
  8. 修改双系统启动的名称
  9. vue-router 中踏过的坑
  10. 《信号与系统学习笔记》—线性时不变系统(二)
  11. python 大智慧自定义数据_大智慧扩展数据、自定义数据.doc
  12. C语言实验—— 数值统计
  13. 距阵乘以一个未知距阵得单位矩阵 怎么算_干货分享:怎样假装一个带货流水过亿的直播达人?...
  14. mysql .ibd_MySQL单表ibd文件恢复方法详解
  15. 使用HoloLens 2调用深度相机和前置摄像头
  16. LinuxC语言简单实现图片加马赛克-标准IO实现
  17. solr 6.1.0 的配置及简单使用
  18. 如何用计算机求极限,计算器的极限_500字
  19. Jenkins Pipeline 一键部署SpringBoot项目
  20. mysql 主辅_Mysql的实时同步 - 主辅同步

热门文章

  1. C 语言printf打印各种数据类型的方法(u8/s8/u16/s16.../u64/double/float)(全)
  2. html字体怎么变大,网页字体怎么变大(html怎么改字体类型)
  3. BigBrother的大数据之旅Day 15 sqoop
  4. CDOJ 1144 Big Brother 二分图匹配
  5. 百度地图 地址查询经纬度 插件vue-baidu-map
  6. java中new具体意思_java中new是什么意思?
  7. 邵阳市计算机学校某灿,最近喜欢上一首歌。。 大家把自己觉得好听的歌和我分享分享吧。...
  8. 微软发布安卓手机的Office预览版,需申请内测
  9. shell(9): shell脚本安装chajian
  10. 基于php的养生食疗,夏季养生宜吃的8种食物