LIM  LongIntegerMathematic - Rechnen mit beliebig langen Zahlen



Hinweise


Ausgabe Lim.info():
------------------------------------------------------------------------
 INTEGER-MATHEMATIK MIT (FAST) BELIEBIG VIELEN BIT-STELLEN

 Eingestellt sind  224  Bit-Stellen, die in Schritten
 von  32  Bits veränderbar sind.

 Dezimal-Stellen:  67½
 Zahlenbereich:
 +13479973333575319897333507543509815336818572211270286240551805124607
 -13479973333575319897333507543509815336818572211270286240551805124608

 Statischer Speicher :  672+224+24+80= 1000 Byte
 Bitstellen maximal  :  1431655744
 Kaskadierte 'long's :  7  (max=44739242)

                               Helmut Schellong, Bad Salzuflen, 1995-97
------------------------------------------------------------------------

Datei lim.cpp ==> lim.obj :
     class Lim { /* ÷60 Zeilen */ };
     //670 Zeilen C-Funktionen
     //Eigene Speicherverwaltung ohne new und delete!

Datei lim.h :
     class Lim { /* ÷200 Zeilen */ };

Datei lim_appl.cpp :
     #include "lim.h"

bcc lim_appl.cpp lim.obj


Im Anwendungsprogramm lim_appl.cpp - Beispiele:
-----------------------------------------------

#                include "lim.h"

{ Lim  obj, a(123L), b("12345678900000000123456789"), c(b);
  const char *cp= a;              //cp="123"
  int i;

  b("sqrt").put("sqrt(b)=");
  Lim(25L)("!").put("25!Fakultät=");
  obj("!",25).put("25!Fakultät=");
  
  a("n:k",32,5).put("Anzahl Poker-Blätter=32:5=");
  for (i=1,c("nxtnbit",0x1f);  (c("nxtnbit"), c.I<32);  ++i);
             printf("Anzahl Poker-Blätter=32:5=%d\n", i);
  a("nxtnbit",0x1f).put("5bit: ");
  a("nxtnbit").put("5bit: ");
  a("nxtnbit").put("5bit: ");
  
  if (a(101,"tstbit"))  printf("bit101==1\n");
  if (a(70,6,"getbits")==22)  a("setbits",69,-6), a("clrbits",70,2);
  
  if (!!a && (int)a && (i=a))  printf("obj==true\n");
  if ( !a )                    printf("obj==false\n");
  
  if (b[3])  b[5]=123L;        // Zugriff long-Kaskade
  long l= b;                   // entspricht l=b[0];
  b= l;                        // movsx b,l
  
  (Lim(2L)^127 ).put("2e127=");
  (Lim(2L)^127L).put("2xor127=");
  obj.info();

  // Es wurden fast alle Operatoren mehrfach überladen.
}


{ Lim *z,mw; int n; long nm; char *s;
  //...
  while (n-- >0)  z= rand128(s), z->put("z128: "), mw+= *z, s=0;
  (mw/=nm).put("Mittelwert=");
}


static Lim *rand128(const char *s)
{
   static int F;                 // Temporäre Objekte vermieden:
   static Lim  next,r, m,c,s0,cut;
   if (!F)  ++F, m=s0=cut=1L, cut=(m<<=192),m/=11163L, c=14639L,
            s0<<=64,s0/=5L, cut--, next=s0;
   if (s&&*s)  next=s,next<<=64,next|=s0,next&=cut;
   next*=m, next+=c, next&=cut;
   return (r=next,r>>=64,  &r);
}



//   Copyright (C) 1995  Helmut Schellong
//   Tiefer Grund 12
//   32108 Bad Salzuflen
//   Tel/Fax (05222) 84540
//   schellong@t-online.de
//   http://home.t-online.de/home/schellong