zyl910

优化技巧、硬件体系、图像处理、图形学、游戏编程、国际化与文本信息处理。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  215 随笔 :: 0 文章 :: 145 评论 :: 111万 阅读
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

有一个只用4行代码就实现的计算Pi的程序,被称为外星人计算Pi的程序。

有许多人讨论分析了该程序的实现原理,如:http://blog.csdn.net/panqiaomu/archive/2006/05/07/711776.aspx

但我总感觉它分析得不够透彻,于是自己分析了一下。

1.将原程序修改成更易看懂的形式;

2.采用同样的算法,用Excel表格将Pi算了出来。

下载(注意修改下载后的扩展名)
 

/*
File:      Pi800.c
Name:      分析外星人计算PI的程序
Author:    zyl910
Blog:      http://blog.csdn.net/zyl910/
Version:   V1.0
Updata:    2006-11-5
分析外星人计算PI的程序
~~~~~~~~~~~~~~~~~~~~~~
原始程序:
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公式:
          1          2          3                    k
pi = 2 + --- * (2 + --- * (2 + --- * (2 + ...  (2 + ---- * (2 + ... ))...)))
          3          5          7                   2k+1
*/
int main(void)
{
 long a=10000;// 缩放系数
 long c=2800; // 迭代次数
 long f[2801];// 中间计算结果
 long d;      // 内循环误差累计项
 long e=0;    // 外循环误差累计项
 long b, g;   // 分子 与 分母. k/(2k+1)
 int i, j;
 for(i=0; i<c; i++) // 若完全依照公式,循环条件应为“for(i=1; i<=c; i++)”。幸好f[2800]的贡献非常小,取任意值都不会对精度造成太大的影响
  f[i] = 2 * a/10; // 2就是公式中的系数2。 a/10的意思是保留一个十进制位,因为输出是从个位3开始的
 while(c > 0)
 {
  d = 0;
  g = (c*2 + 1) - 2;      // 分母。因为每次循环都输出了4位,所以在后面运算时乘以了a,所以这里得 -2
  b = c;                  // 分子
  while(b > 0)
  {
   /* 根据公式,乘以分子 */
   d *= b;
   d += f[b]*a;  // 因为每次外循环都输出了4位
   /* 根据公式,除以分母 */
   f[b] = d % g; // 带分数的 分子部分
   d /= g;       // 带分数的 整数部分
   /* Next */
   g -= 2;
   b--;
  }
  printf("%.4d", e+d/a);
  e = d % a;
  c -= 14; // 因为精度固定为800位,每输出4位后,相当于精度需求降低了4位,所以每次可以少算14项
 }
 printf("/n");
 return 0;
}

posted on   zyl910  阅读(379)  评论(0编辑  收藏  举报
编辑推荐:
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示