Simon Plouffe 1996 计算 pi 算法的 C 实现失败

标签 c algorithm pi

您可以在维基百科文章“pi 的近似值”中查看 pi 公式。我被这个公式所吸引,因为它很紧凑并且保证了高效的计算,而且它是专门针对基数 10 的。公式是

 pi = -3 + SUM(n=0,oo): n*(2^n)*(n!)^2/(2*n)!

我的C代码如下。看起来非常简单。它计算了所有中间步骤,但完全无法收敛。有什么错误?

#include <stdio.h>
#include <math.h>
#define sq(x)  ((x)*(x))
int nfac(int);
int main()
{
  double term, denom, sum;
  double w, x, y, z, pi;
  int n;

/* Plouffe's 1996 algorithm 
(see http://en.wikipedia.org/wiki/Approximations_of_π:  */
  sum = -3.;
  for(n=1; n <= 11; n++)
  {
    printf("n= %d\n", n);
    printf("n! = %.0f\n", w = nfac(n));
    printf("(n!)^2 = %.0f\n", x = sq(w));
    printf("2^n = %.0f\n", y = pow(2,n));
    printf("(2*n)! = %.0f\n", z = nfac(2*n));
    printf("n*2^n)*((n!)^2)/(2*n)! = %f\n", term = n*y*x/z);
    printf("sum = %f\n\n", sum += term);
  }
  printf("pi = %.10f\n\n", pi = sum); 
}

int nfac(int n)
{
  int i, nn;

  if(n==0) return 1;

  nn = 1;
  for(i=1; i<=n; i++)
    nn= i*nn;
  return nn;
}

最佳答案

简单!您的 nfac 方法返回一个 int...

在计算过程中,您还将使用诸如 22 之类的参数来调用它 (行:printf("(2*n)!= %.0f\n", z = nfac(2*n)); with n = 11)。

其结果适合int内部;)

我建议为 nfac 使用另一种类型,但正如其他人已经建议的那样,我不知道即使使用 double 时结果会有多精确。

关于Simon Plouffe 1996 计算 pi 算法的 C 实现失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18804545/

相关文章:

python - 最长递增唯一子序列

Java - 圆周率的拉马努金系列

c - 用阿基米德方程逼近 Pi

c - 使用缓冲区溢出执行shell代码

c++ - C:C 中的 volatile 数组

c - 基于队列数组的实现

clang -o 删除了我的 .c 文件?

Java - 我的字母顺序排序算法并不总是按预期工作

c - 如何编写一个 C 程序来检查一个点是否位于给定其对角线之一的端点的正方形内

iphone - 如何在cocos2d中显示pi字符