home *** CD-ROM | disk | FTP | other *** search
/ Aminet 15 / Aminet 15 - Nov 1996.iso / Aminet / misc / math / CalcE_Pi_src.lha / CalcE / src / CalcE.c next >
Encoding:
C/C++ Source or Header  |  1996-04-01  |  2.1 KB  |  159 lines

  1. #include <proto/dos.h>
  2. #include <proto/exec.h>
  3. #include <exec/memory.h>
  4. #include <math.h>
  5.  
  6. #define TEMPLATE "DECIMALES/N"
  7. #define MEM "Pas assez de mémoire.\n"
  8. #define MSG "\n \033[1mCalcE 1.0\033[0m      Ringard' Production 95\n\n   Allenbrand Brice\n   5 rue du Manège\n   68100 Mulhouse\n\n"
  9.  
  10. UBYTE *s,*x;
  11. long xs,ts,i,ndigits,nprint;
  12.  
  13. void initinteger(UBYTE *x,long n);
  14. void add(UBYTE *s,UBYTE *x,long xs);
  15. void sub(UBYTE *s,UBYTE *x,long xs);
  16. void divide(UBYTE *x,long xs,long n,UBYTE *y,long *ys);
  17.  
  18.  
  19. __saveds int e(void)
  20. {
  21.  struct DosLibrary *DOSBase;
  22.  struct RDArgs *rdargs;
  23.  long ret=RETURN_FAIL;
  24.  long opts[]={0,0};
  25.  
  26.  if(DOSBase=(struct DosLibrary *)OpenLibrary("dos.library",0))
  27.  {
  28.   rdargs=ReadArgs(TEMPLATE,opts,NULL);
  29.   if(opts[0])
  30.   {
  31.    ndigits=(*(long *)opts[0])+10;
  32.    nprint=ndigits+7;
  33.  
  34.    if(s=(UBYTE *)AllocVec((ndigits<<1)+2,MEMF_PUBLIC|MEMF_CLEAR))
  35.    {
  36.     x=s+ndigits+1;
  37.     s[0]=x[0]=1;
  38.     i=0;
  39.     do
  40.     {
  41.      i++;
  42.      divide(x,xs,i,x,&xs);
  43.      add(s,x,xs);
  44.     }
  45.     while(xs<=ndigits);
  46.     Printf("E=\n%ld.",s[0]);
  47.     for(i=1;i<=ndigits-10;i++)
  48.     {
  49.      Printf("%ld",s[i]);
  50.      if(i%4==0)
  51.       Printf(" ");
  52.      if(i%28==0)
  53.       Printf("\n  ");
  54.     }
  55.     Printf("\n");
  56.     FreeVec(s);
  57.     ret=RETURN_OK;
  58.    }
  59.    else
  60.     Printf(MEM);
  61.    FreeArgs(rdargs);
  62.   }
  63.   else
  64.    Printf(MSG);
  65.   CloseLibrary((struct Library *)DOSBase);
  66.  }
  67.  return(ret);
  68. }
  69.  
  70. void divide(UBYTE *x,long xs,long n,UBYTE *y,long *ys)
  71. {
  72.  long i,c;
  73.  
  74.  c=0;
  75.  for(i=xs;i<=ndigits;i++)
  76.  {
  77.   c=c*10+x[i];
  78.   y[i]=c/n;
  79.   c%=n;
  80.  }
  81.  *ys=xs;
  82.  while(*ys<=ndigits&&y[*ys]==0)
  83.   (*ys)++;
  84. }
  85.  
  86. void add(UBYTE *s,UBYTE *x,long xs)
  87. {
  88.  long i,c;
  89.  
  90.  c=0;
  91.  for(i=ndigits;i>=xs;i--)
  92.  {
  93.   c+=s[i]+x[i];
  94.   if(c>=10)
  95.   {
  96.    s[i]=c-10;
  97.    c=1;
  98.   }
  99.   else
  100.   {
  101.    s[i]=c;
  102.    c=0;
  103.   }
  104.  }
  105.  i=xs;
  106.  while(c)
  107.  {
  108.   i--;
  109.   c+=s[i];
  110.   if(c>=10)
  111.   {
  112.    s[i]=c-10;
  113.    c=1;
  114.   }
  115.   else
  116.   {
  117.    s[i]=c;
  118.    c=0;
  119.   }
  120.  }
  121. }
  122.  
  123. void sub(UBYTE *s,UBYTE *x,long xs)
  124. {
  125.  long i,c;
  126.  
  127.  c=0;
  128.  for(i=ndigits;i>=xs;i--)
  129.  {
  130.   c+=s[i]-x[i];
  131.   if(c<0)
  132.   {
  133.    s[i]=c+10;
  134.    c=-1;
  135.   }
  136.   else
  137.   {
  138.    s[i]=c;
  139.    c=0;
  140.   }
  141.  }
  142.  i=xs;
  143.  while(c)
  144.  {
  145.   i--;
  146.   c+=s[i];
  147.   if(c<0)
  148.   {
  149.    s[i]=c+10;
  150.    c=-1;
  151.   }
  152.   else
  153.   {
  154.    s[i]=c;
  155.    c=0;
  156.   }
  157.  }
  158. }
  159.