W.Ehrhardt: Sonstiges

Es ist seit mehr als 15 Jahren bekannt, daß exp bis zu 13 Bits für
extended Argumente verliert; selbst die neueren Delphi-Versionen
(bestätigt bis D14, einige sind korrigiert in D17) haben schlimme Bugs: z.B.
arccsch(2) = 0.27980789397 (korrekt = 0.48121182506);
coth(12000)=1 oder sech(12000)=0 stürzen ab,
sinh(x)/x=0 statt 1 für kleine x,
sin(1e22)=1e22 (korrekt = -0.852200849767);
StdDev(a,a+1,a+2) stürzt ab für a=100000000000; usw.

Die elementaren mathematischen Funktionen umfassen:
Exponential-, Logarithmus-, trigonometrische, hyperbolische, inverse
trigonometrische / hyperbolische Funktionen.
Weiter gibt es Polynom-, Vektor- und Statistikprozeduren,
sowie Fließkomma- und FPU-Kontrollfunktionen.

Delphis unsinnige Routinen
(IfThen, IsZero, InRange …) und seine Finanzfunktionen sind nicht
(und werden auch nicht) implementiert. Hier ist die vollständige Liste der
AMath-Funktionen mit kurzen Beschreibungen.

Alle elementaren transzendenten Standard-Funktionen mit einem Argument haben
maximale relative Fehler kleiner als 2.2e-19, die Werte für power(x,y)
sind 2.1e-19 (für |x|,|y| < 1000) und 3.4e-19 (für |x|,|y| < 2000).
Die Genauigkeit wird ermittelt mit dem Programm
t_amathx, das MPArith-Prozeduren benutzt.

Die double-extended ext2-Routinen arbeiten mit Paaren von
Extended-Gleitkommazahlen, die die nicht-ausgewertete Summe der höher- und niederwertigen Teile
repräsentieren a = (a.h, a.l) = a.h + a.l, normalerweise mit |a.l| ≤ eps_x*|a.h|.

Util

PRNG

MPArith

AMath

DAMath

zlib

Delphi CRT-Unit

  • Base2N V0.41:
    Allgemeine Konvertierungen zur Basis 2**N, N=1…6
  • Bitarray V0.19:
    Bit-Array-Context mit max. 524160 Bits (Nebenprodukt des MPArith-Siebs
    für 16-Bit-Primzahlen)
  • BTypes V0.21:
    Gemeinsame portable Basis-Datentypen
  • Compvers V0.36:
    Compiler-Version als String oder Symbol
  • Dates V0.35:
    Implementiert Compiler- und Betriebssystem unabhängige Routinen für
    das aktuelle Datum und die aktuelle Zeit (incl. Millisekunden seit
    Mitternacht) und Funktionen für Julianische Tageszahlen.
  • Hrtimer V0.28:
    Enthält einen hochauflösenden Zeitmesser für
    Pascal/Delphi-Compiler, es wird der comp Datentyp verwendet. Der Zeitmesser
    benutzt den RDTSC-Befehl, deshalb stoppt die Unit auf allen Systemen, die
    diesen Befehl nicht unterstützen (abschaltbar via $ifdef). HRTimer wird
    von einigen Optimierungs-Testprogrammen benötigt.
  • memh V0.15:
    Implementiert portable Funktionen für sichere Speicherbelegung auf dem Heap.
  • Mem_util V0.99:
    Implementiert Compiler-unabhängige Routinen zum Vergleich von
    Speicherblöcken und zur Darstellung von Speicherbereichen als HEX- und
    Base64-Strings.
  • Ministat V0.45:
    Kleine Statistik-Unit mit akkuraten „laufende Statistik“-Routinen für
    eine und zwei Variable.
  • Sort V1.18:
    Allgemeine QuickSort-, HeapSort- (Standard und Bottom-up), CombSort-Routinen,
    die swap/compare-Funktionen benutzen. Zusätzliche Pointerversionen haben
    einen typlosen Zeiger, der in den Routinen durchgeschleift wird und zum
    Zugriff auf lokale Daten usw. des Aufrufers verwendet werden kann.
  • std.inc V1.66:
    Standard-Includedatei für Compiler­erkennung, Standard­definitionen, Optionen.
  • Tsc V0.41:
    Diese Unit verwendet einen maschinennäheren Zugriff auf den TSC als
    hrtimer. Es wird außerdem ein systemabhängiger allgemeiner Zähler bereitgestellt
    (TSC falls vorhanden; sonst GetTickCount, 18.2 Hz Systick-Zähler oder Millisekunden seit
    Mitternacht).
  • Bob Jenkins Public-Domain-Generator ISAAC
     (Indirection, Shift, Accumulate, Add, und Count).
    Die mittlere Periodenlänge wird mit 2**8295 angegeben, die minimale Länge ist 2**40.
  • salsar basiert auf der Salsa20-Stromchiffre und benötigt die
    salsa20-Unit aus salsa_JJJJ-MM-TT.zip.
    Die Basisroutine verwendet 128-Bit Schlüssel und 8 Runden (dieser Standardwert
    kann mit der Prozedur salsar_set_rounds auf 12 oder 20 geändert werden).
  • aesr benutzt CTR-Modus-Routinen aus aes_JJJJ-MM-TT.zip
    mit 128-Bit Schlüsseln.
  • Neue Funktionen:
    is_Carmichael32, mpc_exp2, mpc_exp10, mpc_expm1, mpc_ln1p;
  • Geänderte Funktionen:
    Jetzt erlaubt n > p-1 in s_mp_nroot_modp, mpc_coth ohne vers;
  • Fehlerkorrekturen:
    Korrigierte Eingabe für JACOBI in mp_calc, Argument-Check in mpc_agm1;
  • Anderes:
    Ausgabe Faktoren/Check nur wenn trace = true in Unit pfdu,
    einige Aufrufe mp_clear[x] in Unit mp_rsa verschoben,
    angepaßte Version des T_Calc-Rechner.

  • AMath V2.09:
    Diese Unit implementiert akkurate elementare Funktionen;
    AMath stellt viele der Delphi-Math-Funktionen für die anderen unterstützten
    Pascalversionen zur Verfügung und beseitigt Fehler und Ungenauigkeiten von Delphi.

  • Die Unit AMTools V0.35 bietet akkurate und zuverlässige Werkzeuge zur
    Nullstellenbestimmung und Suche lokaler Minima von Funktionen, zur
    näherungsweisen Berechnung von eindimensionalen Integralen,
    zur Konvergenz-Beschleunigung von Folgen und Reihen,
    sowie zur Lösung quadratischer und kubischer Gleichungen:

    Die Funktionen localmin, mbrent, fmin (sie unterscheiden sich nur
    durch Anzahl der Parameter) verwenden Brents Algorithmus mit garantierter
    Konvergenz zur Bestimmung eines lokalen Minimums einer Funktion
    in einem Intervall (a,b). Der Algorithmus kombiniert Suche via
    Goldenem Schnitt und sukzessive parabolische Interpolation und benutzt
    nur Funktionsaufrufe (keine Ableitungen).

    Die Funktionen zbrent und zeroin benutzen den Brent/Dekker-Algorithmus
    mit garantierter Konvergenz zur Nullstellen-Berechnung einer stetigen Funktion
    in einem Intervall [a,b], wenn f(a) und f(b) verschiedene Vorzeichen haben;
    zbrenty findet Nullstellen von f(x)-y. Der Algorithmus basiert auf
    der Kombination von wiederholter Interpolation und Bisektion.

    Die qag*-Prozeduren sind Pascalübersetzungen der entsprechenden
    Quadpack
    -Algorithmen von R. Piessens, E. de Doncker-Kapenga, C.W. Überhuber, D. Kahaner.
    Diese global-adaptiven Routinen implementieren die numerische Integration
    von Funktionen über endlichen oder unendlichen Intervallen und arbeiten
    mit Gauss-Kronrod-Regeln für die Teilintervalle und Wynns Epsilon-Algorithmus
    zur Konvergenz-Beschleunigung. Sie können relativ schwierige Integrale
    berechnen, u.a. auch für Integranden mit Sprungstellen und integrierbaren
    Singularitäten. quagk ist eine einfache übergeordnete Prozedur, die die
    speziellen Routinen aufruft.
    Der Quadpack-Algorithmus qawc berechnet den Cauchyschen Hauptwert
    von f(x)/(x-c) mit einer global-adaptiven Strategie und modifizierter
    Clenshaw-Curtis-Integration auf den Teilintervallen, die den Punkt x=c enthalten.

    Die Prozeduren intdeo und intdei
    benutzen die doppelt-exponentielle (DE) Transformation (entwickelt von M. Mori, T. Ooura und anderen)
    zur automatischen Quadratur von f(x) über das halbunendliche Intervall (a,+INF)
    für Funktionen mit und ohne oszillatorische Faktoren.
    Die DE Transformation ist sehr wirkungsvoll, wenn die
    Abszissen a+xi mit großer Genauigkeit berechnet werden können;
    deshalb werden die beiden Routinen am besten mit a=0 benutzt, ansonsten
    können ernsthafte Rundungsprobleme auftreten (a+xi=a).

    Der adaptive Quanc8-Algorithmus von G.E. Forsythe, M.A. Malcolm, C.B. Moler
    approximiert das Integral einer glatten Funktion über einem endlichen
    Intervall mit Hilfe einer Newton-Cotes-Regel.


    Die Prozeduren levinu1 und wynneps1 sind eigenständige
    Versionen von bereits verwendeten Methoden zur Konvergenz-Beschleunigung,
    sie führen jeweils einen Schritt der Levin u-Transformation für Summen
    oder eine Iteration des Wynnschen Epsilon-Algorithmus
    für Summen oder Folgen aus (spezialisierte Originalversionen
    werden in LerchPhi bzw. den Quadpack-Routinen eingesetzt).
    Der Konvergenz-Verlauf der Prozesse muß von den übergeordneten
    aufrufenden Routinen analysiert und überwacht werden.

    Die squad-Funktionen berechnen
    genaue Lösungen quadratischer Gleichungen mit Double-Koeffizienten,
    sie implementieren Ideen von G.E. Forsythe, W. Kahan, P.H. Sterbenz
    (hochgenaue Berechnung der Diskriminante, Skalierung mit Zweierpotenzen).

    Die cubsolve-Prozedur ermittelt die Lösungen reeller kubischer
    Gleichungen mit Double-Koeffizienten, sie beruht auf Vorlesungsnotizen von W. Kahan.


  • Die Units SpecFun/SpecFunX V1.39.04 implementieren viele spezielle
    Funktionen mit Double- und Extended-Genauigkeit. In dieser Ausgabe sind
    folgende Funktionsgruppen verfügbar:

    Zur Zeit gibt es für alle Funktionen Double- und Extended-Versionen
    (extended mit Suffix x, z.B. erfc vs. erfcx).
    Hier ist die vollständige Liste der
    Speziellen Funktionen
    mit kurzen Beschreibungen.
    Die Datei specialfunctions.pdf
    enthält das (englische) Referenzhandbuch Spezielle Funktionen mit Implementationshinweisen.

    Im allgemeinen haben die Extended-Versionen der Funktionen größere relative
    Fehler (gemessen in den entsprechenden relativen Rundungseinheiten eps_x bzw.
    eps_d) als ihre Double-Gegenstücke, insbesondere gammax und
    betax
    für große Argumente. Weiterhin ist zu beachten, daß
    einige Funktionen bei kleinen Argumentänderungen starke Änderungen
    bei den Funktionswerten zeigen; bei hochgenauen Vergleichen sollten deshalb
    nur Argumentwerte verwendet werden, die in beiden Rechnungen exakt darstellbar sind.


  • Die Unit AMCmplx V0.91 implementiert AMath-basierte komplexe Arithmetik
    sowie grundlegende und transzendente Funktionen;
    hier die komplette Liste
    mit kurzen Beschreibungen, im Referenz-PDF gibt es ein eigenes Kapitel.
    Der Datentyp complex ist ein Record mit
    Real- und Imaginärteil vom Typ extended. Die meisten Routinen sind Prozeduren
    mit const Eingabe-Record(s) und var Ausgabe;
    deshalb setzt die Unit BP7 oder neuere Compiler voraus.

    Bitte beachten: Die Exponential-, trigonometrischen und Hyperbel-Funktionen
    können Überlauf erzeugen oder INF bzw. NaN zurückliefern für Eingaben
    mit Real- oder Imaginärteil in der Nähe von ln_MaxExt oder größer,
    diese Situationen werden systematischer in kommenden Versionen behandelt.

  • Bessel-Funktionen und verwandte,
  • elliptische Integrale/Funktionen und Thetafunktionen,
  • Exponentialintegrale und verwandte,
  • Fehlerfunktion und verwandte,
  • Gamma-Funktion und verwandte,
  • Zetafunktionen, Polylogarithmen und verwandte,
  • orthogonale Polynome, Legendrefunktionen und verwandte,
  • hypergeometrische Funktionen und verwandte,
  • statistische Verteilungen,
  • und verschiedene spezielle Funktionen.

  • DAMath V0.85:
    Diese Unit implementiert akkurate elementare mathematische Funktionen mit
    Double-Genauigkeit: Exponential-, Logarithmus-, trigonometrische, hyperbolische, inverse
    trigonometrische / hyperbolische Funktionen; außerdem gibt es
    Polynom-, Vektor- und Statistikprozeduren und Fließkomma-Funktionen.

    Aus der System-Unit benutzt DAMath die Funktionen abs, arctan, frac, int, ln und trunc
    (einschließlich vorhandener Fehler in 32-Bit-Versionen).
    Weil FPC-64 (Versionen ≤ 2.6.4) bis zu 13 der 53 Bits für die Exponentialfunktion verliert,
    implementiert DAMath eine eigene exp-Funktion. System.sin(x)
    und cos(x) werden für |x| ≤ Pi/4 benutzt, für |x| > 2^30 wird die
    Bereichsreduktion nach Payne/Hanek verwendet.

    Unter Win7/64 haben die DAMath-64-Bit-Versionen der elementaren transzendenten
    Standardfunktionen mit einem Argument und die Potenzfunktion maximale relative
    Fehler kleiner als 2*eps_d (ca. 4.4e-16), die RMS-Werte sind < 0.6*eps_d;
    die vollständige Liste und die entsprechenden Zahlen für Delphi/FPC
    findet man in der Datei t_xdamat64.cmp.

    Die double-double dbl2-Routinen rechnen mit Paaren von 53-Bit-Zahlen, die die
    nicht-ausgewertete Summe repräsentieren a = (a.h, a.l) = a.h + a.l,
    normalerweise mit |a.l| ≤ eps_d*|a.h|.


  • Die Unit DAMTools V0.35 bietet akkurate und zuverlässige Werkzeuge zur
    Nullstellenbestimmung und Suche lokaler Minima von Funktionen, zur
    näherungsweisen Berechnung von eindimensionalen Integralen,
    zur Konvergenz-Beschleunigung von Folgen und Reihen,
    sowie zur Lösung quadratischer Gleichungen.

  • Die auf DAMath basierenden Speziellen Funktionen mit Doubleprecision
    sind aus den AMath-Implementationen abgeleitet, d.h. die
    Beschreibungen in der Einführung
    und im Referenzmanual specialfunctions.pdf
    sind (mit offensichtlichen Einschränkungen) im wesentlichen gültig,
    die Funktionen der Interface-Unit SpecFunD V1.24.04
    haben die gleichen Namen usw. Hier einige interne Details:


  • Die Unit DAMCmplx V0.51 implementiert DAMath-basierte komplexe Arithmetik
    sowie grundlegende und transzendente Funktionen; der Datentyp
    complex ist ein Record mit Real- und Imaginärteil vom Typ double.
  • Die internen Funktionen haben den Prefix sfd_, die Unitnamen
    beginnen mit sd, z.B. sdBessel vs. sfBessel.
  • Konstanten, Argument- und Funktionswert-Bereiche wurden an Doubleprecision
    angepaßt.
  • Hex/Extended-Konstrukte wurden durch Hex/Double ersetzt (teilweise neuberechnet).
  • Die meisten Approximationen mit Polynomen oder rationalen Funktionen wurden
    beibehalten, sie sind deshalb manchmal sub-optimal (optimale Doubleprecision-Approximationen
    sind in der Regel sehr verschieden).
  • Chebyshev-Approximationen konnten einfach an Doubleprecision angepaßt werden!
  • Der relative Fehler der Speziellen Funktionen aus DAMath ist normalerweise
    größer (besonders auf 64-Bit-Systemen) als der der entsprechenden AMath
    Double-Funktionen (die oft wegen der internen Extended-Arithmetik korrekt
    gerundet sind).
  • Die Code-Basis V1.1.4 ist sehr alt und es gibt inzwischen neuere und
    bessere Zlib-Versionen. Deshalb sollten neuere Delphi- und FPC-Versionen
    soweit möglich die mitgelieferten Zlib-Units verwenden.
  • Meine zlib-Routinen sollten nur auf Dateien mit weniger als 2 GB angewendet
    werden (32 Bitzähler; Delphi eof-Fehler und/oder 32-Bit filesize Funktion).
© 2016 W.Ehrhardt Letzte Änderung 23. Okt. 2016
Start CRC/Hash Krypto Sonstiges Info Links English
Sonstiges
BP7 BP7 D6 D6 D18/64 D18/64
Generator ctx Größe Periode ca. C/B MB/s C/B MB/s C/B MB/s
random (4) 2**32 79.0 21.4 7.5 226.0 5.8 399.1
taus88 16 2**88 79.0 21.5 8.0 211.9 10.8 213.5
taus113 20 2**113 85.0 20.0 8.0 211.9 13.5 170.0
kiss123 20 2**123 114.0 14.9 13.3 127.9 15.0 153.0
tt800 106 2**800 308.3 5.5 18.5 91.7 18.0 126.7
xor4096 522 2**4096 80.0 21.0 6.5 260.7 12.3 187.3
mt19937 2502 2**19937 227.4 7.4 8.3 204.5 12.6 181.5
aesr 290 2**128 211.2 8.0 28.4 59.7 60.2 38.1
salsar 202 2**70 108.3 15.7 15.4 110.3 31.1 73.8
isaac 2066 2**8295 122.0 13.9 9.0 189.3 12.8 178.9
Start CRC/Hash Krypto Sonstiges Info Links English

procedure generic_init(var ctx: generic_ctx; seed: longint);
  {-Init context from seed}

procedure generic_init0(var ctx: generic_ctx);
  {-Init context from randseed}

procedure generic_next(var ctx: generic_ctx);
  {-Next step of PRNG}

procedure generic_read(var ctx: generic_ctx; dest: pointer; len: longint);
  {-Read len bytes from the PRNG to dest}

function  generic_long(var ctx: generic_ctx): longint;
  {-Next random positive longint}

function  generic_dword(var ctx: generic_ctx): {$ifdef HAS_CARD32}cardinal{$else}longint{$endif};
  {-Next 32 bit random dword (cardinal or longint)}

function  generic_word(var ctx: generic_ctx): word;
  {-Next random word}

function  generic_double(var ctx: generic_ctx): double;
  {-Next random double [0..1) with 32 bit precision}

function  generic_double53(var ctx: generic_ctx): double;
  {-Next random double in [0..1) with 53 bit precision}

function  generic_selftest: boolean;
  {-Simple self-test of PRNG}

std.zipstd.incBTypesVor dem Herunterladen von Software von diesen Seiten bitte diesen
rechtlichen Hinweis beachten.
Letzte Änderungen:Letzte Änderungen: taus88taus113tt800mt19937kiss123 xor4096kryptographischeMultipräzisions-Arithmetik für ganze, rationale,
reelle und komplexe Zahlen
Letzte Änderungen:akkurate mathematische MethodenrmNearest80-Bit-ExtendedkeineLetzte Änderungen:AMathSpezielle FunktionenAMToolsakkurate mathematische MethodenDoublekeineAMathLetzte Änderungen:DAMathSpezielle FunktionenDAMToolsPASZLIB 1.0zlibexzpipeLetzte Änderungen: zlibzlibhgzioBitte beachten:Letzte Änderungen: nichtAusschlußhinweisHinweis:nichtrandomministat-hrtimer-{$define testing}constFeaturesconstderuses-‚unit was based heavily
off of the Borland CBuilder 5 RTL‘
readkeykeypressed
UtilPRNGMPArithAMathDAMathzlibDelphi CRTutil_2016-05-01.zipprng_2013-01-07.zipmpa_2016-10-23.zipEinführungsseite FunktionslisteReferenzabschnittamath_2016-10-23.zipDAMath-Einführungsseitedamath_2016-10-23.zipzlibw114_2015-09-14.zipzlibFZCA-DemoprogrammMPArithdcrt_2013-01-07.zipLinks

Nach oben scrollen