|
|
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