各种语言计算任意精度圆周率的网站

回复
头像
shaoziyang
帖子: 3950
注册时间: 2019年 10月 21日 13:48

各种语言计算任意精度圆周率的网站

#1

帖子 shaoziyang »

无意中看到一个介绍各种语言计算任意精度圆周率的网站,分享给大家。

图片

https://rosettacode.org/wiki/Pi


Basic

代码: 全选

10 PRINT CHR$(147)
20 n = 100
30 ln = int(10*n/4)
40 nd = 1
50 dim a(ln)
60 n9 = 0
70 pd = 0 :rem First predigit is a 0
80 :
90 for j = 1 to ln
100    a(j-1) = 2 :rem Start with 2s
110 next j
120 :
130 for j = 1 to n
140     q = 0
150     for i = ln to 1 step -1 :rem Work backwards
160         x = 10*a(i-1) + q*i
170         a(i-1) = x - (2*i-1)*int(x/(2*i-1)) :rem X - INT ( X / Y) * Y
180         q = int(x/(2*i - 1))
190     next i
200     a(0) = q-10*int(q/10)
210     q = int(q/10)
220     if q=9 then n9 = n9 + 1 : goto 450
240     if q<>10 then 350
250     rem q == 10
260        d = pd+1 : gosub 500
270        if n9 < 0 then 320
280           for k = 1 to n9
290              d = 0: gosub 500
300           next k
310        rem end if
320        pd = 0
330        n9 = 0
335        goto 450
340     rem q <> 10
350        d = pd: gosub 500
360        pd = q
370        if n9 = 0 then 450
380           for k = 1 to n9
390              d = 9 : gosub 500
400           next k
410           n9 = 0
450 next j
460 print mid$(str$(pd),2,1)
470 end
480 :
490 rem outputd
500 if nd=0 then print mid$(str$(d),2,1); : return
510 if d=0 then return
520 print mid$(str$(d),2,1);".";
530 nd = 0
550 return
Pascal

代码: 全选

Program Pi_Spigot;
const
  n   = 1000;
  len = 10*n div 3;
 
var
  j, k, q, nines, predigit: integer;
  a: array[0..len] of longint;
 
function OneLoop(i:integer):integer;
var
  x: integer;
begin
  {Only calculate as far as needed }
  {+16 for security digits ~5 decimals}
  i := i*10 div 3+16;
  IF i > len then
    i := len;
  result := 0;
  repeat   {Work backwards}
    x  := 10*a[i] + result*i;
    result := x div (2*i - 1);
    a[i]   := x - result*(2*i - 1);//x mod (2*i - 1)
    dec(i);
  until i<= 0 ;
end;
 
begin
 
  for j := 1 to len do
    a[j] := 2;                 {Start with 2s}
  nines := 0;
  predigit := 0;               {First predigit is a 0}
 
  for j := 1 to n do
  begin
    q := OneLoop(n-j);
    a[1] := q mod 10;
    q := q div 10;
    if q = 9 then
      nines := nines + 1
    else
      if q = 10 then
      begin
        write(predigit+1);
        for k := 1 to nines do
          write(0);            {zeros}
        predigit := 0;
        nines := 0
      end
      else
      begin
        write(predigit);
        predigit := q;
        if nines <> 0 then
        begin
          for k := 1 to nines do
            write(9);
          nines := 0
        end
      end
  end;
  writeln(predigit);
end.
Python

代码: 全选

def calcPi():
    q, r, t, k, n, l = 1, 0, 1, 1, 3, 3
    while True:
        if 4*q+r-t < n*t:
            yield n
            nr = 10*(r-n*t)
            n  = ((10*(3*q+r))//t)-10*n
            q  *= 10
            r  = nr
        else:
            nr = (2*q+r)*l
            nn = (q*(7*k)+2+(r*l))//(t*l)
            q  *= k
            t  *= l
            l  += 2
            k += 1
            n  = nn
            r  = nr
 
import sys
pi_digits = calcPi()
i = 0
for d in pi_digits:
    sys.stdout.write(str(d))
    i += 1
    if i == 40: print(""); i = 0

回复

  • 随机主题
    回复总数
    阅读次数
    最新文章