LIM LongIntegerMathematic - Rechnen mit beliebig langen Zahlen
Hinweise
Die Header-Datei lim.h enthält C++-Klassen, die das Rechnen
mit beliebig langen
Zahlen ermöglichen.
Diese Klassen enthalten viele Funktionen, die die mathematischen und auch
andere Operationen vornehmen. Quellkode für diese Funktionen
enthält lim.cpp.
Der vollständige Quellkode wird nicht angeboten!
Die Funktionen als Bibliothek lim.obj werden nicht kostenlos
abgegeben!
Unten wird auch ein 128-Bit-Zufallsgenerator als Lim-C++-Funktion vorgestellt.
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