计算圆周率的C程序

这是很早以前用C语言写的一个计算圆周率的程序,  算法是用泰勒公式计算反正切值。在命令行不跟参数执行该程序则使用Gauss公式计算前1000位圆周率的值,如果带一个命令行参数,则该值为要计算的位数。如果还有第二个命令行参数,则使用Stomer公式计算,可作为验算。因为该程序只涉及到纯数学计算,可以在Linux、Unix、Windows等操作系统下编译并运行。当时写这个程序时,int是2个字节的,现在大多数的C编译器int都是4个字节,不过这不影响程序的正确性。

#include <stdio.h>

#include <stdlib.h>

main(int argc, char * argv[])

{

  long * pi, * t, m, n, r, s;

  int t0[][3] = {48, 32, 20, 24, 8, 4}, k0[][3] = {1, 1, 0, 1, 1, 1};

  int n0[][3] = {18, 57, 239, 8, 57, 239}, d, i, j, k, p, q;

  d = (argc > 1) ? (((i = atoi(argv[1])) < 0) ? 0 : i) : 1000;

  q = (argc > 2) ? 1 : 0;

  printf("%s\n\n", "Nature (R) Pi value compute Program  (C) Tue 1999.11.30");

  printf("pi= %s%d * arctg(1/%d) %s %d * arctg(1/%d) %s %d * arctg(1/%d) [%s]\n",

    k0[q][0] ? "" : "-", t0[q][0], n0[q][0], k0[q][1] ? "+" : "-", t0[q][1],

    n0[q][1], k0[q][2] ? "+" : "-", t0[q][2], n0[q][2], q ? "Stomer" : "Gauss");

  if ((t = (long *)calloc((d += 5) + 1, sizeof(long))) == NULL) return 1;

  if ((pi = (long *)calloc(d + 1, sizeof(long))) == NULL) return 2;

  for (i = d; i >= 0; i--) pi[i] = 0;

  for (p = 0; p < 3; p++) {

    for (k=k0[q][p], n=n0[q][p], t[i=j=d]=t0[q][p], i--; i >= 0; i--) t[i] = 0;

    for (r = 0, i = j; i >= 0; i--) {

      r = (m = 10 * r + t[i]) % n;

      t[i] = m / n;

      k ? (pi[i] += t[i]) : (pi[i] -= t[i]);

    }

    while (j > 0 && t[j] == 0) j--;

    for (k = !k, s = 3, n *= n; j > 0; k = !k, s += 2) {

      for (r = 0, i = j; i >= 0; i--) {

        r = (m = 10 * r + t[i]) % n;

        t[i] = m / n;

      }

      while (j > 0 && t[j] == 0) j--;

      for (r = 0, i = j; i >= 0; i--) {

        r = (m = 10 * r + t[i]) % s;

        m /= s;

        k ? (pi[i] += m) : (pi[i] -= m);

      }

    }

  }

  for (n = i = 0; i <= d; pi[i++] = r) {

    n = (m = pi[i] + n) / 10;

    if ((r = m % 10) < 0) r += 10, n--;

  }

  printf("pi= %ld.", pi[d]);

  for (i = d - 1; i >= 5; i--)

    printf("%ld%s", pi[i], ((m = d - i + 5) % 65) ? ((m % 5) ? "" : " ") : "\n");

  printf("%sDIGITS: %d\n", (m % 65) ? "\n" : "", d - 5);

  return 0;

}

下面是程序运行结果:

Nature (R) Pi value compute Program  (C) Tue 1999.11.30

pi= 48 * arctg(1/18) + 32 * arctg(1/57) - 20 * arctg(1/239) [Gauss]

pi= 3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510 58209 74944

59230 78164 06286 20899 86280 34825 34211 70679 82148 08651 32823 06647 09384

46095 50582 23172 53594 08128 48111 74502 84102 70193 85211 05559 64462 29489

54930 38196 44288 10975 66593 34461 28475 64823 37867 83165 27120 19091 45648

56692 34603 48610 45432 66482 13393 60726 02491 41273 72458 70066 06315 58817

48815 20920 96282 92540 91715 36436 78925 90360 01133 05305 48820 46652 13841

46951 94151 16094 33057 27036 57595 91953 09218 61173 81932 61179 31051 18548

07446 23799 62749 56735 18857 52724 89122 79381 83011 94912 98336 73362 44065

66430 86021 39494 63952 24737 19070 21798 60943 70277 05392 17176 29317 67523

84674 81846 76694 05132 00056 81271 45263 56082 77857 71342 75778 96091 73637

17872 14684 40901 22495 34301 46549 58537 10507 92279 68925 89235 42019 95611

21290 21960 86403 44181 59813 62977 47713 09960 51870 72113 49999 99837 29780

49951 05973 17328 16096 31859 50244 59455 34690 83026 42522 30825 33446 85035

26193 11881 71010 00313 78387 52886 58753 32083 81420 61717 76691 47303 59825

34904 28755 46873 11595 62863 88235 37875 93751 95778 18577 80532 17122 68066

13001 92787 66111 95909 21642 01989

DIGITS: 1000

版权声明:本文为博主http://www.zuiniusn.com原创文章,未经博主允许不得转载。

时间: 2024-12-11 00:22:18

计算圆周率的C程序的相关文章

计算圆周率

Digits of Pi: In this problem you have to find as many digits of PI as possible. Output: Output must contain as many digits of PI as possible (not more than 1,000,000). Score: The score awarded to your program will be the first position of the digit

循环-02. 计算圆周率(15)

循环-02. 计算圆周率(15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 杨起帆(浙江大学城市学院) 根据下面关系式,求圆周率的值,直到最后一项的值小于给定阈值. 输入格式: 输入在一行中给出小于1的阈值. 输出格式: 在一行中输出满足阈值条件的近似圆周率,输出到小数点后6位. 输入样例: 0.01 输出样例: 3.132157 1 #include<stdio.h> 2 #include<stdlib.h>

蒙特卡洛方法计算圆周率的三种实现-MPI openmp pthread

蒙特卡洛方法实现计算圆周率的方法比较简单,其思想是假设我们向一个正方形的标靶上随机投掷飞镖,靶心在正中央,标靶的长和宽都是2 英尺.同时假设有一个圆与标靶内切.圆的半径是1英尺,面积是π平方英尺.如果击中点在标靶上是均匀分布的(我们总会击中正方形),那么飞镖击中圆的数量近似满足等式 飞镖落在圆内的次数/飞镖落在标靶内的总次数=π/4 因为环包含的面积与正方形面积的比值是π/4. 因为环所包含的面积与正方形面积的比值是π/4. 我们可以用这个公式和随机数产生器来估计π的值. 伪代码如下: numb

蒙特卡罗方法计算圆周率

蒙特卡罗方法计算圆周率 前几天读到了一篇网志:蒙特卡罗方法入门,http://www.ruanyifeng.com/blog/2015/07/monte-carlo-method.html 其中介绍了用概率计算圆周率的方法,所以就用程序做了以下尝试. 作为常量的PI值的近似在Math.PI中为3.141592653589793. Ⅰ.方形中的所有像素计算 package yumu.probability.montecarlo; public class CalculatePI { private

利用“三角化”计算行列式快速求解程序(验证过很多题目的,绝对准确)

#include<iostream>#include<cmath>using namespace std;void main(){ //输入行列式开始 int n,i,j,a[10][10],T[10],max[10],b[10],k,q,p; float t[10][10],c,sum=-1; cout<<"阶数:"; cin>>n; cout<<"行列式:"<<endl; for(i=1;i

一个简单的计算分数的小程序

一个简单的计算分数的小程序 代码如下: package Day05; public class ExamGradeDemo { public static void main(String[] args) { char[][] answers = { {'C','B','D','C','A','A','D','C','D','C'}, {'A','C','B','D','C','A','D','C','B','D'}, {'A','C','B','D','B','D','C','A','A','

c语言学习之不同方式计算圆周率

 /*************************************************** * 功能: *        通过概率法和切割法计算圆周率 * 说明: *        概率法需要输入圆没的点数 *        切割法需要输入切割的次数 ***************************************************/ #include <stdio.h> #include <time.h> #include <stdl

计算圆周率pai的公式:pai = 4*(1-1/3+1/5-1/7 ....)

历史上有许多计算圆周率pai的公式,其中,格雷戈里和莱布尼茨发现了下面的公式: pai = 4*(1-1/3+1/5-1/7 ....) 这个公式简单而优美,但美中不足,它收敛的太慢了. 如果我们四舍五入保留它的两位小数,那么: 累积了1项和是:4.00 累积了2项和是:2.67 累积了3项和是:3.47 ... 请你写出它累积了100项的和是多少(四舍五入到小数后两位). 源代码: #include<stdio.h> //pai = 4*(1-1/3+1/5-1/7 ....) double

C语言计算圆周率PI的代码

下面的内容段是关于C语言计算圆周率PI的内容. #include "stdio.h" #include "stdlib.h" #define SCALE 10000 #define ARRINIT 2000 void pi_digits(int digits) { int carry = 0; int arr[digits + 1]; for (int i = 0; i <= digits; ++i) arr[i] = ARRINIT; for (int i