当前位置: 首页 > news >正文

圆周率π是怎么算出来的,用程序怎么算

    下午在看一个算法的时候,突然看到了一个关于圆周率的问题,如果问你圆的周长怎么算,你肯定毫不犹豫是2πR,但是π是怎么算出来的呢?估计我们都没有想过,所以我们看很多算法的时候,其实只是给了我们一个公式,其实和不懂差不多不是很大。

    我来调用下我薄弱的数学细胞,简单来看一下。把一个圆如果展开,得到的就是圆的周长,即一个非精确值3.1415926。

640?wx_fmt=gif

我们来推算一下,下面的这个六边形,如果圆心为中心,那么半径是和六边形的边长度是一样的。假设半径长度是1,则六边形的边也是1。

640?wx_fmt=png

    如果要求得圆周的长度,其实就是不断的把多边形扩张,一条边继续细分为两个角,即十二边形,如此类推,那么得到的结果就是一个极为精确的了。

    本来想着公式应该推导起来不难,结果发现数学基础确实不扎实。

第一次推导是按照这种标记方式来的,貌似少了个条件,在左边各种推导,推导失败。

640?wx_fmt=png

    然后换了个思路,重新来推导,总算有了起色。

640?wx_fmt=png

    所以我们可以很明确的知道,如果扩张后的长度和原来的长度的关系是这样的。那么我们就可以借助程序来实现圆周率的算法了。

    当然假设我们是不知道圆周率这个东西的,在知道了这个关联关系后,其实可以继续做一些推导。

    比如六边形,假设边长为x,则6x的长度是一个最粗略的圆的周长,这样一来,周长就是近似于6,它和半径的关系就是6*1,按照2πR的公式来看,其实也可以理解为2R(即为直径),当然实际周长要比6大一点。也就是我们计算π的意义了。

    所以只要切分的边足够多,那么得到的π的值也就更加精确。这个时候写程序的话,可以参考如下的方式,不断的切分。

import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
       System.out.println("请输入割圆次数:");
       int n = scan.nextInt();
       cut(n);
   }

static void cut(int n) {
double y = 1.0;
   for (int i = 0; i <= n; i++) {
double π = 3 * Math.pow(2, i) * y;
       System.out.println("第" + i + "次切割,为正" +
Math.round( 3 * Math.pow(2, i+1)) + "边形,圆周率π≈" + π);
       y = Math.sqrt(2 - Math.sqrt(4 - y * y));
   }
}
}

程序的输出如下:


请输入割圆次数:
15
       第0次切割,为正6边形,圆周率π≈3.0

       第1次切割,为正12边形,圆周率π≈3.1058285412302498

       第2次切割,为正24边形,圆周率π≈3.132628613281237

       第3次切割,为正48边形,圆周率π≈3.139350203046872

       第4次切割,为正96边形,圆周率π≈3.14103195089053

       第5次切割,为正192边形,圆周率π≈3.1414524722853443

       第6次切割,为正384边形,圆周率π≈3.141557607911622

       第7次切割,为正768边形,圆周率π≈3.141583892148936

       第8次切割,为正1536边形,圆周率π≈3.1415904632367617

       第9次切割,为正3072边形,圆周率π≈3.1415921060430483

       第10次切割,为正6144边形,圆周率π≈3.1415925165881546

       第11次切割,为正12288边形,圆周率π≈3.1415926186407894

       第12次切割,为正24576边形,圆周率π≈3.1415926453212157

       第13次切割,为正49152边形,圆周率π≈3.1415926453212157

       第14次切割,为正98304边形,圆周率π≈3.1415926453212157

       第15次切割,为正196608边形,圆周率π≈3.1415926453212157

    想象古代的人能够计算到小数点后7位,在条件那么简单的情况,真是厉害。


关于圆周率计算的方法,后续再花一些时间琢磨下,比如用蒙特卡洛的算法。今天给我最大的一个收获是让我真正做了一些计算,能够推导出一个看起来有些复杂的公式,看来小学初中的课程内容我开始熟悉起来了。


个人微信公众号,欢迎扫码关注。

640?wx_fmt=gif


相关文章:

  • 明天,实现几个还不错的功能点
  • 运维开发里程碑的小结
  • 下周搞几件事情,说说你的计划吧
  • 自问自答的一些运维开发问题
  • 两个有点纠结的问题
  • 防火墙开通的自动化尝试和感悟
  • 使用shell脚本得到MySQL实例列表
  • 运维开发的开源项目
  • 关于运维开发,说说你的看法
  • Greenplum集群故障修复小记
  • 运维开发流程梳理和思考
  • MySQL 8.0初体验
  • Oracle Cloud初体验
  • MySQL权限开通的设计方案
  • Oracle Cloud for MySQL的初步测试
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • ES6系列(二)变量的解构赋值
  • gitlab-ci配置详解(一)
  • Golang-长连接-状态推送
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • python docx文档转html页面
  • Python利用正则抓取网页内容保存到本地
  • session共享问题解决方案
  • Spark RDD学习: aggregate函数
  • SQL 难点解决:记录的引用
  • STAR法则
  • Swift 中的尾递归和蹦床
  • Vue.js源码(2):初探List Rendering
  • 关于 Cirru Editor 存储格式
  • 解析带emoji和链接的聊天系统消息
  • 前端_面试
  • 一个项目push到多个远程Git仓库
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • ###项目技术发展史
  • #{} 和 ${}区别
  • #LLM入门|Prompt#3.3_存储_Memory
  • %check_box% in rails :coditions={:has_many , :through}
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (搬运以学习)flask 上下文的实现
  • (原創) 物件導向與老子思想 (OO)
  • (转) Face-Resources
  • (转)JAVA中的堆栈
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • @Data注解的作用
  • @SuppressWarnings注解
  • @Transactional 竟也能解决分布式事务?
  • [<死锁专题>]
  • [20161101]rman备份与数据文件变化7.txt
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [c#基础]DataTable的Select方法
  • [Flexbox] Using order to rearrange flexbox children
  • [HCIE] IPSec-VPN (手工模式)
  • [HDU 3555] Bomb [数位DP]