0

しばらく前に (場所を思い出せません)、Pi の桁数を計算するためのスピゴット アルゴリズムを実装する次の python スニペットを見つけました。

def pi_digits():
    """generator for digits of pi"""
    q,r,t,k,n,l = 1,0,1,1,3,3
    while True:
        if 4*q+r-t < n*t:
            yield n
            q,r,t,k,n,l = (10*q,10*(r-n*t),t,k,(10*(3*q+r))/t-10*n,l)
        else:
            q,r,t,k,n,l = (q*k,(2*q+r)*l,t*l,k+1,(q*(7*k+2)+r*l)/(t*l),l+2)

digits = pi_digits()
for i in range(30): print digits.next()

これを C++ に実装したいと思います。私の試みは:

#include <cmath>
#include <cstdlib>
#include <iostream>

typedef long long ll;

void help() {
  std::cout << "Usage: pi2 <digits>" << std::endl;
  exit(1);
}

void pi(const long long digits) {
  ll q, r, t, k, n, l;
  q=1;
  r=0;
  t=1;
  k=1;
  n=3;
  l=3;
  for(ll i=0; i<digits; ++i) {
    if(4*q+r-t < n*t) {
      std::cout << n;
      q=10*q;
      r=10*(r-n*t);
      n = ( 10 * ( 3 * q + r) / t ) - 10 * n; //Thanks to maverik
    } else {
      q=q*k;
      r=(2*q+r)*l;
      t=t*l;
      k=k+1;
      n=(q*(7*k+2)+r*l)/(t*l);
      l=l+2;
    }
  }
}

int main(int argc, char** argv) {
  if(argc<2) help();
  ll digits = 0;
  if(digits=atoll(argv[1])<1) help();
  pi(digits);
  return 0;
}

しかし、Python バージョンが動作している間、std::cout::operator<< を呼び出すことはありません。手伝って頂けますか?

ありがとう。

4

2 に答える 2

1

あるはずのように見えます(pythonコードによると):

n = ( 10 * ( 3 * q + r) / t ) - 10 * n;

そしてそこに:

if ( 4 * q + r - t < n * t) ...

それとも私は何かを逃したのですか?

于 2012-12-22T15:07:24.677 に答える