home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 502a.lha / longpi / LONGPI.C < prev    next >
C/C++ Source or Header  |  1991-05-05  |  3KB  |  150 lines

  1. #include <stdio.h>
  2.  
  3. long kf,ks,*mf,*ms;
  4. long    cnt,n,temp,nd;
  5. long    i;
  6. long    col,col1;
  7. long    loc,stor[21];
  8. FILE    *fp;
  9.  
  10. shift(l1,l2,lp,lmod)
  11. long *l1,*l2,lp,lmod;
  12. {
  13. long k;
  14.      k=((*l2)>0 ? (*l2)/lmod : -(-(*l2)/lmod)-1);
  15.      *l2 -= k*lmod;
  16.      *l1 += k*lp;
  17. }
  18.  
  19. yprint(m)
  20. long m;
  21. {
  22.  
  23.     if (cnt < n)
  24.     {
  25.         if (++col==11)
  26.         {
  27.             col = 1;
  28.             if (++col1==6)
  29.             {
  30.                 col1=0;
  31.                 fprintf(fp,"\n");
  32.    printf("\n");
  33.                 fprintf(fp,"%4ld",m%10);
  34.                 printf("%4ld",m%10);
  35.             }
  36.             else {
  37.                 fprintf(fp,"%3ld",m%10);
  38.                 printf("%3ld",m%10);
  39.             }
  40.         }
  41.         else {
  42.             fprintf(fp,"%ld",m);
  43.             printf("%ld",m);
  44.         }
  45.         cnt++;
  46.     }
  47. }
  48.  
  49. xprint(m)
  50. long m;
  51. {
  52. long ii,wk,wk1;
  53.  
  54.     if (m<8)
  55.     {
  56.         for (ii=1; ii<=loc;)
  57.             yprint(stor[ii++]);
  58.         loc=0;
  59.     }
  60.     else
  61.     if (m>9)
  62.     {
  63.         wk = m/10;
  64.         m %= 10;
  65.         for (wk1=loc; wk1>=1;wk1--)
  66.         {
  67.             wk += stor[wk1];
  68.             stor[wk1] = wk % 10;
  69.             wk /= 10;
  70.         }
  71.     }
  72.     stor[++loc] = m;
  73. }
  74.  
  75. main(argc,argv)
  76. int argc;
  77. char *argv[];
  78. {
  79. int i=0;
  80.  
  81.     stor[i++] = 0;
  82.     if (argc < 2)
  83.     {           
  84.         fprintf(stderr,"Format is:\n\tlongpi <# of places>\n");
  85.         exit();
  86.     }
  87.     
  88.     n = atoi(argv[1]);
  89.  
  90.     mf = (long *)calloc((int)n+3, sizeof(long));
  91.     if (mf==0)
  92.     {
  93.         fprintf(stderr,"Memory allocation failure [mf]\n");
  94.         exit();
  95.     }
  96.  
  97.     ms = (long *)calloc((int)n+3, sizeof(long));
  98.     if (ms==0)
  99.     {
  100.         fprintf(stderr,"Memory allocation failure [ms]\n");
  101.         exit();
  102.     }
  103.  
  104.     printf("Memory allocated.\n");
  105.  
  106.     fp = fopen("ram:pi.out","w");
  107.     fprintf(fp,"\nThe following is an approximation of PI to %ld digits\n",(long)n);
  108.     printf("\nThe following is an approximation of PI to %ld digits\n",(long)n);
  109.    
  110.     cnt = 0;
  111.     kf = 25;
  112.     ks = 57121L;
  113.     mf[1] = 1;
  114.     for (i=2; i<=n; i+=2)
  115.     {
  116.         mf[i] = -16;
  117.         mf[i+1] = 16;
  118.     }
  119.  
  120.     for (i=1; i<=n; i+=2)
  121.     {
  122.         ms[i] = -4;
  123.         ms[i+1] = 4;
  124.     }
  125.  
  126.     fprintf(fp,"\n 3.");
  127.     printf("\n 3.");
  128.    
  129.     while (cnt < n)
  130.     {
  131.         for (i=0; ++i<=n-cnt;)
  132.         {
  133.             mf[i] *= 10;
  134.             ms[i] *= 10;
  135.         }
  136.         for (i=n-cnt+1; --i>=2;)
  137.         {
  138.             temp = 2*i-1;
  139.             shift(&mf[i-1],&mf[i],temp-2,temp*kf);
  140.             shift(&ms[i-1],&ms[i],temp-2,temp*ks);
  141.         }
  142.         nd = 0;
  143.         shift(&nd,&mf[1],1L,5L);
  144.         shift(&nd,&ms[1],1L,239L);
  145.         xprint(nd);
  146.     }
  147.     printf("\n\nCalculations Completed!\n");
  148. }
  149.    
  150.