尝试用程序计算Π(3.141592653......)
文章目录
- 1. π\piπ
- 2. 用微积分来计算π\piπ
- 2.1 原理
- 2.2 代码
- 2.3 结果
- 2.4 分析
1. π\piπ
π\piπ的重要性或者地位不用多说,有时候还是很好奇,精确地π\piπ值是怎么计算出来的。研究π\piπ的精确计算应该是很多数学家计算机科学家努力的方向,很多算式看起来和π\piπ没有一点关系,但是最后的表达式中却包含π\piπ。
作为一个国家定义的从事信息技术的“新时代农民工”,要验证某些式子相对来说就容易得多了。
2. 用微积分来计算π\piπ
2.1 原理
小学时候就知道了圆的面积公式S=πr2S=\pi r^2S=πr2,到了高中学习了微积分,方程与曲线之后可以知道:
x2+y2=r2x^2 + y^2 = r^2x2+y2=r2
表示一个圆,如果y>=0y>=0y>=0则表示上半圆,这个时候上半圆可以表达为一个函数:
y=(r2−x2)y = \sqrt{(r^2-x^2)}y=(r2−x2)
当它是一个单位圆时(r=1)图形如下所示:
根据从微积分的角度来看曲线y(x)与x=0,x∈[−r,r]y(x)与x=0,x\in [-r,r]y(x)与x=0,x∈[−r,r]围成的区域面积,就是圆面积的一半,即上半圆的面积。令圆面积为S,则有:令圆面积为S,则有:令圆面积为S,则有:
S=πr2=2∫−rr(r2−x2)dxS = \pi r^2 = 2\int_{-r}^{r} \sqrt{(r^2-x^2)} dxS=πr2=2∫−rr(r2−x2)dx
现在的工作就变成计算上面右侧的积分式了。积分式用化曲为直(马师傅称为:接 化 发),把圆分成许多直立的小矩形,再求和,小矩形的高为yi=(r2−xi2),宽为Δx,Δx=1ny_i=\sqrt{(r^2-x_{i}^2)},宽为\Delta x, \Delta x=\frac{1}{n}yi=(r2−xi2),宽为Δx,Δx=n1,n表示把圆的面积分为n个小矩形的面积来近似,n越大则近似程度越好,而且当n趋近于无穷时就和积分式完全一致了。
为了求π\piπ那我们只需要用程序帮我们把圆分成一个一个的小矩形再求和就行了,设定圆的半径,每个矩形的宽度,就可以计算积分式的近似值了。
下面的程序就来计算下式
π=2r2∫−rr(r2−x2)dx\pi = \frac{2}{r^2}\int_{-r}^{r} \sqrt{(r^2-x^2)} dxπ=r22∫−rr(r2−x2)dx
2.2 代码
#include <cmath>
#include <iostream>/*** @brief calculate sqrt(r^2-x^2)* * @param x : * @return constexpr long double */
constexpr inline long double IntegralFormula(const long double radius,const long double x)
{return std::sqrt(radius*radius-x*x);
} /*** @brief 计算曲线y=sqrt(r^2-x^2),在 x in [-r,r]的积分* * @param radius : * @param delta_x : * @return constexpr long double */
constexpr long double Integral(const long double radius,const long double delta_x)
{long double sum = 0.0;for (double x = -radius; x <= radius; x += delta_x){sum += delta_x * IntegralFormula(radius,x);}return sum;
}/*** @brief * * @param radius : 半径* @param bin_num : 分成小矩形的数目* @return constexpr long double */
constexpr long double CalculatePi(const long double radius,double bin_num)
{long double delta_x = 2 * radius / bin_num;long double integral = Integral(radius,delta_x);long double pi = integral * 2.0 / (radius * radius);return pi;
}/*** @brief 计算pi值,用单位圆的上半圆做积分,y=sqrt(r^2-x^2),x in [-r,r]* */
void Test()
{constexpr long double true_pi = 3.141592653589793;printf("True PI: %.15Lf\n",true_pi);for(double radius = 10; radius <= 100; radius*=10)for(double bin_num = 100000; bin_num <= 10000000; bin_num*=10){printf("radius:%f, \t bin_num: %f,\t pi: %.20Lf \n",radius,bin_num,CalculatePi(radius,bin_num));}}void Test2()
{double radius = 10000;double bin_num = 100000;printf("radius:%f, \t bin_num: %f,\t pi: %.20Lf \n",radius,bin_num,CalculatePi(radius,bin_num));
}int main()
{Test();Test2();return 0;
}
2.3 结果
输出
True PI: 3.141592653589793
radius:10.000000, bin_num: 100000.000000, pi: 3.14159254840509465393
radius:10.000000, bin_num: 1000000.000000, pi: 3.14159265028029712060
radius:10.000000, bin_num: 10000000.000000, pi: 3.14159265331958147799
radius:100.000000, bin_num: 100000.000000, pi: 3.14159254846500206543
radius:100.000000, bin_num: 1000000.000000, pi: 3.14159265024260935645
radius:100.000000, bin_num: 10000000.000000, pi: 3.14159265331696711159
radius:10000.000000, bin_num: 100000.000000, pi: 3.14159254840753097960
2.4 分析
这重方式用long double的计算精度,但是最后计算的精度最高只到"3.141592653",小数点后9位。分再多的小矩形也没用了,因为计算时候的截断误差已经足够影响计算精度了。不知道有没有什么好的策略保持计算精度的。
相关文章:

尝试用程序计算Π(3.141592653......)
文章目录1. π\piπ2. 用微积分来计算π\piπ2.1 原理2.2 代码2.3 结果2.4 分析1. π\piπ π\piπ的重要性或者地位不用多说,有时候还是很好奇,精确地π\piπ值是怎么计算出来的。研究π\piπ的精确计算应该是很多数学家计算机科学家努力的方向…...

【异常检测三件套】系列3--时序异常检测综述
写在前面: 异常检测共包含3个内容,从多个方面剖析异常检测方法,本文为第三篇。过往内容请查看以下链接: 【异常检测三件套】系列1--14种异常检测算法https://blog.csdn.net/allein_STR/article/details/128114175?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%…...

关于SAP 错误日志解析
有时候启动或操作sap会出现故障,只是察看sap用户当前目录下的日志文件可能不得要领,此时有必要察看work目录下的一些trace. 以Linux系统为例,其他的也差不多。 instance说明 如下 DVEBMGS?? ABAP Central Instance D?? …...

java:自定义变量加载到系统变量后替换shell模版并执行shell
这里的需求前提是,在项目中进行某些操作前,需要在命令后对shell配置文件的进行修改(如ip、port),这个对于用户是不友好的,需要改为用户页面输入ip、port,后台自动去操作修改配置;那么…...

Redis高级删除策略与数据淘汰
第二章:Redis高级 学习目标 目标1:能够说出redis中的数据删除策与略淘汰策略 目标2:能够说出主从复制的概念,工作流程以及场景问题及解决方案 目标3:能够说出哨兵的作用以及工作原理,以及如何启用哨兵 …...

社畜大学生的Python之pandas学习笔记,保姆入门级教学
接上期,上篇介绍了 NumPy,本篇介绍 pandas。 目录 pandas 入门pandas 的数据结构介绍基本功能汇总和计算描述统计处理缺失数据层次化索引 pandas 入门 Pandas 是基于 Numpy 构建的,让以 NumPy 为中心的应用变的更加简单。 Pandas是基于Numpy…...

20_FreeRTOS低功耗模式
目录 低功耗模式简介 STM32低功耗模式 Tickless模式详解 Tickless模式相关配置 实验源码 低功耗模式简介 很多应用场合对于功耗的要求很严格,比如可穿戴低功耗产品、物联网低功耗产品等。 一般MCU都有相应的低功耗模式,裸机开发时可以使用MCU的低功耗模式。 FreeRTOS也…...

Hive的使用方式
操作Hive可以在Shell命令行下操作,或者是使用JDBC代码的方式操作 针对命令行这种方式,其实还有两种使用 第一个是使用bin目录下的hive命令,这个是从hive一开始就支持的使用方式 后来又出现一个beeline命令,它是通过HiveServer2服…...

Flume三大核心组件
Flume的三大核心组件: Source:数据源 Channel:临时存储数据的管道 Sink:目的地 Source:数据源:通过source组件可以指定让Flume读取哪里的数据,然后将数据传递给后面的 channel Flume内置支持读…...

数据结构(六)二叉树
一、树形结构概念树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:1、有一个…...

Docker buildx 的跨平台编译
docker buildx 默认的 docker build 命令无法完成跨平台构建任务,我们需要为 docker 命令行安装 buildx 插件扩展其功能。buildx 能够使用由 Moby BuildKit 提供的构建镜像额外特性,它能够创建多个 builder 实例,在多个节点并行地执行构建任…...

【java基础】方法重载和方法重写
文章目录方法重载方法重写方法重载 方法重载就是可以在一个类里面定义多个相同名称的方法,只需要参数列表的个数或者类型不同就行。 public class Overload {public int add(int a, int b) {return a b;}public double add(double a, double b) {return a b;}}对…...

Gradle7.4安装与基本使用
文章目录一.前言二.下载Gradle三.Gradle镜像源-全局级配置四.配置Gradle wrapper-项目级配置五.Gradle对测试的支持五.生命周期5.1 settings文件六.Gradle任务入门6.1 任务行为6.2 任务依赖方式七. Dependencies依赖引入7.1 依赖冲突及解决方案八.Gradle整合多模块SpringBoot九…...

[系统安全] 虚拟化安全之虚拟化概述
本文为笔者从零基础学习系统安全相关内容的笔记,如果您对系统安全、逆向分析等内容感兴趣或者想要了解一些内容,欢迎关注。本系列文章将会随着笔者在未来三年的读研过程中持续更新,由于笔者现阶段还处于初学阶段,不可避免参照复现各类书籍内容,如书籍作者认为侵权请告知,…...

如何从零开始系统的学习项目管理?
经常会有人问,项目管理到底应该学习一些什么?学习考证之后能得到什么价值? 以下我就总结一下内容 一,学习项目管理有用吗? 有效的项目管理带来的益处大致包括以下几个方面:更有效达成业务目标、满足相关…...

面试题-----
面试题---- 一.HTML 1.常用哪些浏览器进行测试,对应有哪些内核? ①IE------------------->Trident ②Chrome---------->以前是Webkit现在是Blink ③Firefox------------>Gecko ④Safari-------------->Webkit ⑤Opera--------------&…...

线材-电子线载流能力
今天来讲的是关于电子线的一个小知识,可能只做板子的工程师遇到此方面的问题会比较少,做整机的工程师则必然会遇到此方面问题,那就是线材问题。 下面主要说下电子线的过电流能力。(文末有工具下载)电子线(h…...

单变量回归问题
单变量回归问题 对于某房价问题,x为房屋大小,h即为预估房价,模型公式为: hθ(x)θ0θ1xh_{\theta}(x)\theta_{0}\theta_{1}x hθ(x)θ0θ1x 要利用训练集拟合该公式(主要是计算θ0、θ1\theta_{0}、\theta_{1}θ…...

ubuntu/linux系统知识(36)linux网卡命名规则
文章目录背景命名规范系统默认命名规则优势背景 很久以前Linux 操作系统的网卡设备的传统命名方式是 eth0、eth1、eth2等,属于biosdevname 命名规范。 服务器通常有多块网卡,有板载集成的,同时也有插在PCIe插槽的。Linux系统的命名原来是et…...

java的一些冷知识
接口并没有继承Object类首先接口是一种特殊的类,理由就是将其编译后是一个class文件大家都知道java类都继承自Object,但是接口其实是并没有继承Object类的 可以自己写代码测试: 获取接口类的class对象后遍历它的methods,可以发现是不存在Obje…...

java代理模式
代理模式 为什么要学习代理模式?因为这是SpringAOP的底层! 【SpringAOP和SpingMVC}】 代理模式的分类: 静态代理 动态代理 代理就像这里的中介,帮助你去做向房东租房,你不能直接解出房东,而房东和中介…...

JUC包:CountDownLatch源码+实例讲解
1 缘起 有一次听到同事谈及AQS时,我有很多点懵, 只知道入队和出队,CLH(Craig,Landin and Hagersten)锁,并不了解AQS的应用, 同时结合之前遇到的多线程等待应用场景,发现…...

Log4j2基本使用
文章目录1. Log4j2入门2. Log4j2配置3. Log4j2异步日志4. Log4j2的性能Apache Log4j 2是对Log4j的升级版,参考了logback的一些优秀的设计,并且修复了一些问题,因此带 来了一些重大的提升,主要有: 异常处理,…...

A2L在CAN FD总线的使用
文章目录 前言CAN时间参数BTL CyclesTime Quantum时间份额SWJ同步跳转宽度波特率计算采样点计算CAN FD的第二采样点SSP推荐配置A2L配置总结前言 A2L作为XCP标定协议的载体,包括了总线信息的定义。本文介绍如何将基于CAN总线的A2L扩展为支持CAN-FD的A2L CAN时间参数 在介绍配…...

Android JetPack之启动优化StartUp初始化组件的详解和使用
一、背景 先看一下Android系统架构图 在Android设备中,设备先通电(PowerManager),然后加载内核层,内核走完,开始检查硬件,以及为硬件提供的公开接口,然后进入到库的加载。库挂载后开…...

[11]云计算|简答题|案例分析|云交付|云部署|负载均衡器|时间戳
升级学校云系统我们学校要根据目前学生互联网在线学习、教师教学资源电子化、教学评价过程化精细化的需求,计划升级为云教学系统。请同学们根据学校发展实际考虑云交付模型包含哪些?云部署采用什么模型最合适?请具体说明。9月3日买电脑还是租…...

C++11/C++14:lambda表达式
概念 lambda表达式:是一种表达式,是源代码的组成部分闭包:是lambda表达式创建的运行期对象,根据不同的捕获模式,闭包会持有数据的副本或引用闭包类:用于实例化闭包的类,每个lambda表达式都会触…...

算法课堂-分治算法
分治算法 把一任务分成几部分(通常是两部分)来完成(或只完成一部分),从而实现整个任务的完成 或者你可以把递归理解为分治算法的一部分 因为递归就是把问题分解来解决问题 例子 称假币 最笨的方法:两两称…...

操作系统权限提升(十六)之绕过UAC提权-CVE-2019-1388 UAC提权
系列文章 操作系统权限提升(十二)之绕过UAC提权-Windows UAC概述 操作系统权限提升(十三)之绕过UAC提权-MSF和CS绕过UAC提权 操作系统权限提升(十四)之绕过UAC提权-基于白名单AutoElevate绕过UAC提权 操作系统权限提升(十五)之绕过UAC提权-基于白名单DLL劫持绕过UAC提权 注&a…...

实例9:四足机器人运动学正解平面RR单腿可视化
实例9:四足机器人正向运动学单腿可视化 实验目的 通过动手实践,搭建mini pupper四足机器人的腿部,掌握机器人单腿结构。通过理论学习,熟悉几何法、旋转矩阵法在运动学正解(FK)中的用处。通过编程实践&…...