忍者ブログ

好きい夢 昭和な気まぐれ飛行機

Spigotアルゴリズム π

Spigotアルゴリズムによるπの計算に取り組んでいました。とりあえずはC言語で書かれていたものの直訳。

VM命令のバグに悩まされたものの、ようやく解決。

多桁のπの表示ができました。

;;; int base = 10000;     // 基底
;;; int n = 8400;         // 計算項数
;;; int i;                // ループ変数
;;; int temp;             // 一時変数/繰り上がり
;;; int out;              // 出力値
;;; int denom;            // 分母
;;; int numerator[8401];  // 分子
;;;
;;; int main(void)
;;; {
;;;   for( i = 0 ; i < n ; i++ ) {
;;;     numerator[i] = base / 5;
;;;   }
;;;
;;;   out = 0;
;;;   for( n = 8400 ; n > 0 ; n -= 14 ) {
;;;     temp = 0;
;;;     for( i = n - 1 ; i > 0 ; i-- ) {
;;;       denom = 2 * i - 1;
;;;       temp = temp * i + numerator[i] * base;
;;;       numerator[i] = temp % denom;
;;;       temp /= denom;
;;;     }
;;;     printf("%04d", out + temp / base);
;;;     out = temp % base;
;;;   }
;;;   return 0;
;;; }
;;;


(define base 10000)
(define nume (make-vector 8401 (/ base 5)))
(define temp 0)
(define denom 0)
(define out 0)


(define (pai)
  (set! out 0)
  (do ((n 8400 (- n 14)))
      ((<= n 0))
      (do ((i (- n 1) (- i 1)))
          ((<= i 0))
          (set! denom (- (* 2 i) 1))
          (set! temp (+ (* temp i) (* (vector-ref nume i) base)))
          (vector-set! nume i (remainder temp denom))
          (set! temp (quotient temp denom)))
      (display (+ out (quotient temp base)))
      (set! out (remainder temp base))))

norm> (pai)
3141592653589793238462643383279528841971693993751058209749445923078164062862089986280348253421170679・・・・・

PR

コメント

プロフィール

HN:
No Name Ninja
性別:
非公開

P R