求圆周率π位程序分析

本文分析了一个仅用4行代码计算800位圆周率的C程序,该程序基于傅立叶级数展开方法。通过程序展开、数学公式解释和迭代过程的详细解读,揭示了程序如何利用整数除法和误差存储来逼近π值。程序的精妙之处在于其使用了循环和数组来存储和调整误差,确保计算精度。
摘要由CSDN通过智能技术生成

    前几天同学让我帮他看个程序,程序如下:


int a = 10000,b,c=2800,d,e,f[2801],g;

int main()
{
    for(;b-c;) f[b++]=a/5;
    for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)
        for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);
    return 0;
}


当时很惊讶这样就能计算圆周率?查了一下,感觉这几行代码水实在太深了,佩服。

这个小程序是大神Dik T. Winter at CWI 的作品

这个算法主要利用 普遍的傅立叶级数展开方法 来计算圆周率

公式: pi = 2 + 1/3 * (2 + 2/5 * (2 + 3/7 * (2 + ...  (2 + k/2k+1 * (2 + ... ))...)))

好像也有另一种方法:

arccosx
=π/2-arcsinx
=π/2-∫[0,x]d(arcsinx)
=π/2-∫[0,x]dx/√(1-x^2)
=π/2-∫[0,x]∑[(2k)!/(2^k*k!)^2]x^(2k)
=π/2-∑[(2k)!/((2k+1)(2^k*k!))]x^(2k+1)(k=0,1,2,3,4.....),

如果让x=1,可以得到arccos1 = 0 =
=π/2-∑[(2k)!/((2k+1)(2^k*k!))]x^(2k+1)(k=0,1,2,3,4.....),
所以
π/2 = ∑[(2k)!/((2k+1)(2^k*k!))]x^(2k+1)(k=0,1,2,3,4.....),
再用 到欧拉加速收敛变换 得到变成用的公式

之后再将这个公式变为程序,说起来简单,事实很难理解

具体如下,转载自 http://www.cnblogs.com/PegasusWang/archive/2013/03/17/2965189.htm l点击打开链接

 

以下为转载:

long a=10000, b, c=2800, d, e, f[2801], g;main(){ for(;b-c;) f[b++]=a/5;for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)for(b=c; d+=f[b]*a, f[b]=d%--g, d/=g--, --b; d*=b); scanf("%s");}简短的4行代码,就可以精确计算机出800位的PI(圆周率)值。实在太震撼人心了。这样的程序也能运行,竟然还能能完成这样让人难以置信的任务,真是太神了。一、源程序本文分析下面这个很流行的计算PI的小程序。下面这个程序初看起来似乎摸不到头脑,不过不用担心,当你读完本文的时候就能够基本读懂它了。程序一:很牛的计算Pi的程序#include <stdio.h>int a=10000,b,c=2800,d,e,f[2801],g; main(){for(;b-c;)    f[b++]=a/5;for(;d=0,g=c*2;c -=14,printf("%.4d",e+d/a),e=d%a)    for(b=c; d+=f[b]*a,f[b]=d%--g,d/=g--,--b; d*=b);}二、数学公式数学家们研究了数不清的方法来计算PI,这个程序所用的公式如下:pi = 2 + 1/3 * (2 + 2/5 * (2 + 3/7 * (2 + ...  (2 + k/2k+1 * (2 + ... ))...)))至于这个公式为什么能够计算出PI,已经超出了本文的能力范围。下面要做的事情就是要分析清楚程序是如

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值