割圆术计算圆周率

割圆术计算圆周率计算圆周率有多种算法 其中割圆术是中国最早的一种算法 理解简单 适合入门

大家好,欢迎来到IT知识分享网。


前言

计算圆周率有多种算法,其中割圆术是中国最早的一种算法,理解简单,适合入门。而随着计算机、数学的发展,人们发明了更高效的算法,计算机也帮助人们将圆周率计算至小数点后 3.14 万亿位。


一、割圆术简介

割之弥细,所失弥少,割之又割,以至于不可割,则与圆合体,而无所失矣。

——刘徽

二、原理

O r=1 A B C D E F

如图所示,根据圆的面积公式 S = π r 2 S=\pi r^2 S=πr2 可知,当圆的半径为 1 时,圆的面积等于 π,所以我们可以算半径为 1 的正多边形的面积,即可得到近似的 π。观察图像,S > S正24边形 > S正12边形 > S正6边形,所以我们的计算结果的精确度随边的个数的增加而提高,但始终小于 S,即始终小于 π。

三、算法实现

Created with Raphaël 2.2.0 开始 输入边数 n i=0, p=0.5, s=1 i≤n ? p=((p+1)/2^0.5 s=s*p i++ pi=1.5*3^0.5/s 输出 pi 结束 yes no

四、实例代码

Java I

import java.util.Scanner; public class Main { 
      public static void main(String[] args){ 
      Scanner input=new Scanner(System.in); int n=input.nextInt(),i=1; double p=0.5,s=1; while(i<=n){ 
      p=Math.sqrt((p+1)/2); s=s*p; i++; } System.out.println(1.5*Math.sqrt(3)/s); } } 

结果:

99 3.9794 

Java II

该处使用了 java.math.BigDecimal 模块,以提高小数位数。

import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; import java.util.Scanner; public class Main { 
      static MathContext mc = new MathContext(100, RoundingMode.HALF_UP); //BigDecimal开方 public static BigDecimal sqrt(BigDecimal a) { 
      BigDecimal _2=BigDecimal.valueOf(2.0); if(a.compareTo(BigDecimal.ZERO)==0)return BigDecimal.ZERO; else{ 
      BigDecimal x=a; int cnt=0; while(cnt<100){ 
      x=(x.add(a.divide(x,mc))).divide(_2,mc); cnt++; } return x; } } public static void main(String[] args){ 
      Scanner input=new Scanner(System.in); int n=input.nextInt(),i=1; BigDecimal p=new BigDecimal("0.5"),s=BigDecimal.ONE; while(i<=n){ 
      p=sqrt(p.add(BigDecimal.ONE).divide(new BigDecimal("2"),mc)); s=s.multiply(p); i++; } System.out.println(sqrt(new BigDecimal("3")).multiply(new BigDecimal("1.5")).divide(s,mc)); } } 

结果:(该算法精确至小数点后60位)

100 3.74944/*第60位*/ 

Python

该处用到了 decimal 库,精确度更高。

#!/usr/bin/python3 # -*- coding: utf-8 -*- from decimal import * getcontext().prec=256 #数字长度 n,i,c,s=input('请输入n: '),0,Decimal('0.5'),Decimal('1') n=int(n) while i<n: c=((c+1)/2)Decimal('0.5') s*=c i+=1 print('π约为: '+str(Decimal('1.5')*(Decimal('3')Decimal('0.5'))/s)) 

结果:(该算法精确至小数点后 253 位)

请输入n: 1024 π约为: 3./*第253位*/50 

总结

文章结束,你应该掌握了割圆术,运用数学上的极限思维解决问题。对于圆周率的计算,目前已没多大实用意义,但这正是计算机技术进步的一个标尺。

声明:未经作者允许禁止转载。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/137317.html

(0)
上一篇 2025-06-21 16:15
下一篇 2025-06-21 16:20

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信