C#,数值计算,基础函数——任意位数π的数值算法源程序与数据可视化

news2024/9/26 5:21:28

对于数学常数 PI 后面位数的计算与追求,是数学家与计算机科学家们乐此不疲的游戏。

一、圆周率PI简史

圆周率(Pi)是圆的周长与直径的比值,一般用希腊字母π表示,是一个在数学及物理学中普遍存在的数学常数。π也等于圆形之面积与半径平方之比,是精确计算圆周长、圆面积、球体积等几何形状的关键值。


圆周率用希腊字母π(读作[paɪ])表示,是一个常数(约等于3.141592654),是代表圆周长和直径的比值。它是一个无理数,即无限不循环小数。在日常生活中,通常都用3.14代表圆周率去进行近似计算。而用九位小数3.141592654便足以应付一般计算。即使是工程师或物理学家要进行较精密的计算,充其量也只需取值至小数点后几百个位。


古希腊大数学家阿基米德(公元前287年—公元前212年)开创了人类历史上通过理论计算圆周率近似值的先河。阿基米德从单位圆出发,先用内接正六边形求出圆周率的下界为3,再用外接正六边形并借助勾股定理求出圆周率的上界小于4。接着,他对内接正六边形和外接正六边形的边数分别加倍,将它们分别变成内接正12边形和外接正12边形,再借助勾股定理改进圆周率的下界和上界。他逐步对内接正多边形和外接正多边形的边数加倍,直到内接正96边形和外接正96边形为止。最后,他求出圆周率的下界和上界分别为223/71和22/7,并取它们的平均值3.141851为圆周率的近似值。阿基米德用到了迭代算法和两侧数值逼近的概念,称得上是“计算数学”的鼻祖。

 中国古算书《周髀算经》(约公元前2世纪)的中有“径一而周三”的记载,意即取。汉朝时,张衡得出,即(约为3.162)。这个值不太准确,但它简单易理解。

公元263年,中国数学家刘徽用“割圆术”计算圆周率,他先从圆内接正六边形,逐次分割一直算到圆内接正192边形。他说:“割之弥细,所失弥少,割之又割,以至于不可割,则与圆周合体而无所失矣。”这包含了求极限的思想。刘徽给出π=3.141024的圆周率近似值,刘徽在得圆周率=3.14之后,将这个数值和晋武库中汉王莽时代制造的铜制体积度量衡标准嘉量斛的直径和容积检验,发现3.14这个数值还是偏小。于是继续割圆到1536边形,求出3072边形的面积,得到令自己满意的圆周率。

公元480年左右,南北朝时期的数学家祖冲之进一步得出精确到小数点后7位的结果,给出不足近似值3.1415926和过剩近似值3.1415927,还得到两个近似分数值,密率和约率。密率是个很好的分数近似值,要取到才能得出比略准确的近似。在之后的800年里祖冲之计算出的π值都是最准确的。

其中的密率在西方直到1573年才由德国人奥托(Valentinus Otho)得到,1625年发表于荷兰工程师米托尼斯(Metius)的著作中,欧洲称之为Metius' number。

1665年,英国数学家约翰·沃利斯(John Wallis)出版了一本数学专著,其中他推导出一个公式,发现圆周率等于无穷个分数相乘的积。


2015年,罗切斯特大学的科学家们在氢原子能级的量子力学计算中发现了圆周率相同的公式。


2019年3月14日,谷歌宣布圆周率现已到小数点后31.4万亿位。

二、PI的当前世界纪录


2021年8月17日,美国趣味科学网站报道,瑞士研究人员使用一台超级计算机,历时108天,将著名数学常数圆周率π计算到小数点后62.8万亿位,创下该常数迄今最精确值记录。

三、一些PI值

下面给出一些可能用到的PI值。

1、4位PI

PI=3.1415

2、16位PI

PI=3.1415926535897932

3、64位PI

PI=3.1415926535897932384626433832795028841971693993751058209749445923

4、128位PI

PI=3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460

5、256位PI

PI=3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485

6、512位PI

PI=3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244

7、1024位PI

PI=3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788

8、2048位PI

PI=3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859502445945534690830264252230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921642019893809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913151557485724245415069595082953311686172785588907509838175463746493931925506040092770167113900984882401285836160356370766010471018194295559619894676783744944825537977472684710404753464620804668425906949129331367702898915210475216205696602405803815019351125338243003558764024749647326391419927260426992279678235478163600934172164121992458631503028618297455570674983850549458858692699569092721079750930295532116534498720275596023648066549911988183479775356636980742654252786255181841757467289097777279380008164706001614524919217321721477235014144197356854816136115735255213347574184946843852332390739414333454776241686251898356948556209921922218427255025425688767179049460165346680498862723279178608578438382796797668145410095388378636095068006422512520511739298489608412848862694560424196528502221066118630674427862203919494504712371378696095636437191728746776465757396241389086583264599581339047802759009946576407895126946839835259570982582262052248940

四、用家里的台式机创造记录的代码

前面说了:2021年8月17日,瑞士研究人员使用一台超级计算机,历时108天,将著名数学常数圆周率π计算到小数点后62.8万亿位,创下该常数迄今最精确值记录。

显然,你我都没有超级计算机。

但是!但是!但是!即使是家里的台式机没准也可以创造世界记录。

1、运行效果

C# 的代码,分为两部分:

2、Windows Form 部分代码
 

using System;
using System.Text;
using System.Windows.Forms;

using Legalsoft.Alrorithm.Large;

namespace WindowsFormsApp7
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.Text = "C#,任意位π计算的可视化编程——北京联高软件开发有限公司";
            button1.Text = "加油!"; button1.Cursor = Cursors.Hand;
            textBox1.Text = "256";
            panel1.Dock = DockStyle.Top;
            panel2.Dock = DockStyle.Fill;
            webBrowser1.Navigate("http://www.315soft.com");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            PIer lp = new PIer();
            int n = Int32.Parse("0" + textBox1.Text);
            // 安排一个进度条,超过512位的计算变得慢了,以便看到计算进度!
            progressBar1.Value = 0;
            progressBar1.Maximum = n + 1;
            progressBar1.Style = ProgressBarStyle.Continuous;
            StringBuilder sb = new StringBuilder();
            sb.Append("<html><body style='word-break:break-all;'>");
            sb.Append("PI=3.");
            for (int i = 1; i <= n; i++)
            {
                sb.Append(lp.Execute(i));
                progressBar1.Value = i;
                progressBar1.Refresh();
            }
            sb.Append("</body></html>");
            progressBar1.Value = 0;
            webBrowser1.DocumentText = sb.ToString();
        }
    }
}

3、任意位PI计算的C#代码

(改编自Pi Formulas, Algorithms and Computations (bellard.org))

using System;

namespace Legalsoft.Alrorithm.Large
{
	public class PIer
	{
		private int InverseXModuleY(int x, int y)
		{
			int u = x;
			int v = y;
			int c = 1;
			int a = 0;
			do
			{
				int q = v / u;
				int t = c;
				c = a - q * c; a = t; t = u;
				u = v - q * u; v = t;
			} while (u != 0);
			a = a % y;
			if (a < 0) { a = y + a; }
			return a;
		}
		private int MultiplyModule(int a, int b, int m)
		{
			return (int)(FloatModule((double)a * (double)b, m));
		}
		private int PowModule(int a, int b, int m)
		{
			int r = 1;
			int aa = a;
			while (true)
			{
				if ((b & 1) != 0) { r = MultiplyModule(r, aa, m); }
				b = b >> 1;
				if (b == 0) { break; }
				aa = MultiplyModule(aa, aa, m);
			}
			return r;
		}
		private int IsPrime(int n)
		{
			int r, i;
			if ((n % 2) == 0) { return 0; }
			r = (int)(Math.Sqrt(n));
			for (i = 3; i <= r; i += 2)
			{
				if ((n % i) == 0) { return 0; }
			}
			return 1;
		}
		private int NextPrime(int n)
		{
			do { n++; } while (IsPrime(n) == 0);
			return n;
		}
		private double FloatModule(double a, double b)
		{
			return (a - (int)(a / b) * b);
		}
		public int Execute(int n)
		{
			double sum = 0.0;
			int N = (int)((n + 20) * Math.Log(10) / Math.Log(2));
			for (int a = 3; a <= (2 * N); a = NextPrime(a))
			{
				int vmax = (int)(Math.Log(2 * N) / Math.Log(a));
				int av = 1;
				for (int i = 0; i < vmax; i++)
				{
					av = av * a;
				}
				int s = 0;
				int num = 1;
				int den = 1;
				int v = 0;
				int kq = 1;
				int kq2 = 1;
				int t;
				for (int k = 1; k <= N; k++)
				{
					t = k;
					if (kq >= a)
					{
						do
						{
							t = t / a; v--;
						} while ((t % a) == 0);
						kq = 0;
					}
					kq++;
					num = MultiplyModule(num, t, av);
					t = (2 * k - 1);
					if (kq2 >= a)
					{
						if (kq2 == a)
						{
							do
							{
								t = t / a; v++;
							} while ((t % a) == 0);
						}
						kq2 -= a;
					}
					den = MultiplyModule(den, t, av);
					kq2 += 2;
					if (v > 0)
					{
						t = InverseXModuleY(den, av);
						t = MultiplyModule(t, num, av);
						t = MultiplyModule(t, k, av);
						for (int i = v; i < vmax; i++)
						{
							t = MultiplyModule(t, a, av);
						}
						s += t;
						if (s >= av) { s -= av; }
					}
				}
				t = PowModule(10, n - 1, av);
				s = MultiplyModule(s, t, av);
				sum = FloatModule(sum + (double)s / (double)av, 1.0);
			}
			return (int)(Math.Floor((int)(sum * 1e9) / 1e8));
		}
	}
}

150行!不多!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1364267.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于图像分割任务中按照比例将数据集随机划分成训练集和测试集

1. 前言 之前写了分类和检测任务划分数据集的脚本&#xff0c;三大任务实现了俩&#xff0c;基于强迫症&#xff0c;也实现一下图像分割的划分脚本 分类划分数据&#xff1a;关于图像分类任务中划分数据集&#xff0c;并且生成分类类别的josn字典文件 检测划分数据&#xff…

如何计算ThreadLocal对象的hash值?【ThreadLocal技术】(含AtomicInteger的介绍)

如何计算ThreadLocal对象的hash值&#xff1f; 一、前置知识二、问题三、剖析源码&#xff1a;如何计算ThreadLocal对象的hash值&#xff1f;1、源码1.1 咱先得知道nextHashCode的起始值1.1.1 那就要先了解AtomicInteger创建AtomicInteger原子的增减操作原子的加法操作原子的获…

对Tor的去匿名化攻击的调查

文章信息 论文题目&#xff1a;De-Anonymisation Attacks on Tor: A Survey 期刊&#xff08;会议&#xff09;&#xff1a; IEEE Communications Surveys & Tutorials 时间&#xff1a;2021 级别&#xff1a;中科院1区&#xff08;IF&#xff1a;35.6&#xff09; 文章链…

Python 面向对象之反射

Python 面向对象之反射 【一】概念 反射是指通过对象的属性名或者方法名来获取对象的属性或调用方法的能力反射还指的是在程序额运行过程中可以动态获取对象的信息(属性和方法) 【二】四个内置函数 又叫做反射函数 万物皆对象&#xff08;整数、字符串、函数、模块、类等等…

黑马程序员Java项目实战《瑞吉外卖》,轻松掌握springboot + mybatis plus开发核心技术的真java实战项目——第三部分

黑马程序员Java项目实战《瑞吉外卖》&#xff0c;轻松掌握springboot mybatis plus开发核心技术的真java实战项目——第三部分 1. 菜品管理的业务功能1.1 文件的上传和下载&#x1f647;‍♂️1.2 新增菜品1.3 接收页面提交的数据&#x1f647;‍♂️&#xff08;涉及两张表&a…

大数据技术架构

1 技术架构矩阵 大数据技术栈虽然比较多,但可以抽象为输入(数据接入)--处理(数据处理、数据分析)--输出(数据应用)。工作角色分工,数据处理以数据仓库开发人员为主,数据分析以数据分析师为主,其他所有组件、系统、技术相关归为数据平台。 2 数据源 大数据的数据来源…

媒体捕捉-iOS自定义二维码扫描功能

引言 随着iOS 7引入AV Foundation框架&#xff0c;二维码扫描功能已经成为iOS应用程序中不可或缺的一部分。现今&#xff0c;几乎每个应用都充分利用这一功能&#xff0c;为用户提供了诸如扫码登录、扫码填充等丰富多彩的便捷体验。这项技术不仅丰富了应用功能&#xff0c;也为…

我与nano实验室交流群

感兴趣的同学、朋友可以加入群聊共同学习聊天哦。 主要是工训赛、电赛、光电、集成电路等等&#xff0c;会分享一些开源代码&#xff0c;博主自己做的项目&#xff0c;自己画的PCB等等&#xff0c;包含但不限于STM32、K210、V831、机器视觉&#xff0c;机械臂&#xff0c;ROS&a…

Packet Tracer - Configure AAA Authentication on Cisco Routers

Packet Tracer - 在思科路由器上配置 AAA 认证 地址表 目标 在R1上配置本地用户账户&#xff0c;并使用本地AAA进行控制台和vty线路的身份验证。从R1控制台和PC-A客户端验证本地AAA身份验证功能。配置基于服务器的AAA身份验证&#xff0c;采用TACACS协议。从PC-B客户端验证基…

我的隐私计算学习——联邦学习(2)

笔记内容来自多本书籍、学术资料、白皮书及ChatGPT等工具&#xff0c;经由自己阅读后整理而成 &#xff08;三&#xff09;联邦学习的算子 ------------------------ 算子是什么&#xff1f;--------------------------- ​ 从广义上讲&#xff0c;对任何函数进行某一项操作都可…

【Verilog】基于Verilog的DDR控制器的简单实现(一)——初始化

在FPGA中&#xff0c;大规模数据的存储常常会用到DDR。为了方便用户使用&#xff0c;Xilinx提供了DDR MIG IP核&#xff0c;用户能够通过AXI接口进行DDR的读写访问&#xff0c;然而MIG内部自动实现了许多环节&#xff0c;不利于用户深入理解DDR的底层逻辑。 本文以美光(Micro…

Linux驱动学习—中断

1、中断基础概念 1.1 什么是中断 CPU在正常运行期间&#xff0c;由外部或者内部引起的时间&#xff0c;让CPU停下当前正在运行的程序&#xff0c;转而去执行触发他的中断所对应的程序&#xff0c;这就是中断。 响应中断的过程&#xff1a; <1>中断请求 <2>中断…

给您的应用添加弹窗

概述 在我们日常使用应用的时候&#xff0c;可能会进行一些敏感的操作&#xff0c;比如删除联系人&#xff0c;这时候我们给应用添加弹窗来提示用户是否需要执行该操作&#xff0c;如下图所示&#xff1a; 弹窗是一种模态窗口&#xff0c;通常用来展示用户当前需要的或用户必须…

cookie和session、请求转发和重定向

会话 分为有状态会话和无状态会话 在HTML中&#xff0c;"会话"一般指的是Web服务器与客户端&#xff08;通常是浏览器&#xff09;之间进行的一系列请求和响应。它是一种在网络上模拟人与人之间通信的方式&#xff0c;常见于Web应用程序中。 会话、Cookie和Sessio…

JavaScript 基础二part1.运算符:赋值、一元、比较、逻辑运算符

JavaScript 基础二 1.1 赋值运算符1.2 一元运算符自增运算符的用法&#xff1a;例题 1.3 比较运算符不同类型间的比较严格相等对 null 和 undefined 进行比较 1.4 逻辑运算符例题 1.5 运算符优先级 1.1 赋值运算符 赋值运算符&#xff1a;对变量进行赋值的运算符 已经学过的赋…

c++学习第八讲---类和对象---继承

继承&#xff1a; 使子类&#xff08;派生类&#xff09;拥有与父类&#xff08;基类&#xff09;相同的成员&#xff0c;以节约代码量。 1.继承的基本语法&#xff1a; class 子类名&#xff1a;继承方式 父类名{} &#xff1b; 例&#xff1a; class father { public:in…

李沐-《动手学深度学习》-- 01-预备知识

一、线性代数知识 1. 矩阵计算 a. 矩阵求导 ​ 当y和x分别为标量和向量时候&#xff0c;进行求导得到的矩阵形状&#xff0c;矩阵求导就是矩阵A中的每一个元素对矩阵B中的每一个元素求导 ​ 梯度指向的是值变化最大的方向 ​ 分子布局和分母布局&#xff1a; b. 常识 ax…

cube生成电机库,启用了RTOS,编译报错[0xc43ed8:5050106] in osSignalWait

cube生成电机库&#xff0c;启用了RTOS&#xff0c;编译报错[0xc43ed8:5050106&#xff0c;解决办法] in osSignalWait 1.现象 编译报错[0xc43ed8:5050106] in osSignalWait 导致链接失败 2.解决办法 将keil5的版本升级到5.18.00&#xff0c;我的版本也是5.14.00。

我的第一个前端项目,vue项目从零开始创建和运行

​入门前端&#xff0c;从基础做起&#xff0c;从零开始新建项目 背景&#xff1a;VUE脚手架项目是一个“单页面”应用&#xff0c;即整个项目中只有1个网页&#xff01; 在VUE脚手架项目中&#xff0c;主要是设计各个“视图组件”&#xff0c;它们都是整个网页中某个部分&…

Python如何生成个性二维码

Python-生成个性二维码 一、问题描述 通过调用MyQR模块来实现生成个人所需二维码。 安装&#xff1a; pip install myqr 二、代码实现 1.普通二维码 from MyQR import myqr # 普通二维码 myqr.run(wordshttp://www.csdn.net/mayi0312,save_nameqrcode.png ) 效果图&#…