Ich suche eine gute Mathematikbibliothek mit beliebiger Genauigkeit in C oder C ++. Könnten Sie mir bitte einige Ratschläge / Vorschläge geben?
Die Hauptanforderungen:
- Es MUSS beliebig große ganze Zahlen verarbeiten (mein Hauptinteresse gilt ganzen Zahlen). Wenn Sie nicht wissen, was das Wort willkürlich groß bedeutet, stellen Sie sich so etwas wie 100000 vor! (die Fakultät von 100000).
- Die Genauigkeit MUSS NICHT während der Bibliotheksinitialisierung / Objekterstellung angegeben werden. Die Genauigkeit sollte NUR durch die verfügbaren Ressourcen des Systems eingeschränkt werden.
- Es sollte um die volle Leistung der Plattform nutzen und soll „kleine“ Zahlen nativ verarbeiten. Das bedeutet, dass auf einer 64-Bit-Plattform für die Berechnung von 2 ^ 33 + 2 ^ 32 die verfügbaren 64-Bit-CPU-Anweisungen verwendet werden sollten. Die Bibliothek sollte dies NICHT auf die gleiche Weise berechnen wie bei 2 ^ 66 + 2 ^ 65 auf derselben Plattform.
- Es MUSS Addition (+), Subtraktion (-), Multiplikation (*), Ganzzahldivision (/), Rest (%), Potenz (**), Inkrement (++), Dekrement (-), gcd () verarbeiten. , Fakultät () und andere gängige ganzzahlige arithmetische Berechnungen effizient. Die Fähigkeit, Funktionen wie sqrt () (Quadratwurzel), log () (Logarithmus) zu verarbeiten, die keine ganzzahligen Ergebnisse liefern, ist ein Plus. Die Fähigkeit, symbolische Berechnungen durchzuführen, ist noch besser.
Folgendes habe ich bisher gefunden:
- Java ‚s BigInteger und BigDecimal Klasse: Ich habe diese bisher verwenden. Ich habe den Quellcode gelesen, aber ich verstehe die Mathematik darunter nicht. Es kann auf Theorien / Algorithmen basieren, die ich nie gelernt habe.
- Der eingebaute Integer-Typ oder die Kernbibliotheken von bc / Python / Ruby / Haskell / Lisp / Erlang / OCaml / PHP / einigen anderen Sprachen: Einige davon habe ich jemals verwendet, aber ich habe keine Ahnung, welche Bibliothek sie verwenden oder welche Art von Implementierung sie verwenden.
Was ich schon gewusst habe:
- Verwenden Sie ein Zeichen als Dezimalstelle und ein Zeichen * als Dezimalzeichenfolge und berechnen Sie die Ziffern mit einer for-Schleife.
- Verwenden Sie ein int (oder ein long int oder ein long long ) als grundlegende "Einheit" und ein Array davon als beliebige lange Ganzzahl und führen Sie Berechnungen für die Elemente mithilfe einer for-Schleife durch.
- Verwenden eines Integer-Typs zum Speichern einer Dezimalstelle (oder einiger Stellen) als BCD (Binary-Coded Decimal) .
- Booths Multiplikationsalgorithmus
Was ich nicht weiß:
- Drucken des oben genannten binären Arrays in Dezimalzahl ohne Verwendung naiver Methoden. Beispiel für eine naive Methode: (1) Addieren Sie die Bits vom niedrigsten zum höchsten: 1, 2, 4, 8, 16, 32, ... (2) Verwenden Sie eine oben erwähnte Zeichenfolge * , um die Zwischenergebnisse der Dezimalstellen zu speichern ).
Was ich schätze:
- Gute Vergleiche zu GMP , MPFR , decNumber (oder anderen Bibliotheken, die Ihrer Meinung nach gut sind).
- Gute Vorschläge zu Büchern / Artikeln, die ich lesen sollte. Beispielsweise ist eine Darstellung mit Abbildungen zur Funktionsweise eines nicht naiven Konvertierungsalgorithmus von Binär zu Dezimal gut. Der Artikel "Binär-Dezimal-Umwandlung in begrenzter Präzision" von Douglas W. Jones ist ein Beispiel für einen guten Artikel.
- Irgendeine Hilfe.
Bitte beantworten Sie diese Frage NICHT , wenn:
- Sie denken, dass die Verwendung eines Double (oder eines Long Double oder eines Long Long Double ) dieses Problem leicht lösen kann. Wenn Sie dies glauben, bedeutet dies, dass Sie das zur Diskussion stehende Problem nicht verstehen.
c++
c
biginteger
bigdecimal
gmp
Siu Ching Pong -Asuka Kenji-
quelle
quelle
Antworten:
GMP ist die beliebte Wahl. Squeak Smalltalk hat eine sehr schöne Bibliothek, die jedoch in Smalltalk geschrieben ist.
Sie haben nach relevanten Büchern oder Artikeln gefragt. Der schwierige Teil von Bignums ist die lange Teilung. Ich empfehle Per Brinch Hansens Artikel Multiple-Length Division Revisited: Eine Tour durch das Minenfeld .
quelle
char *
(die jeweilschar
eine Dezimalstelle darstellt) oder eineint *
BCD-Zeichenfolge ( jeweils eine Dezimalstelle) angewendet werden. jeweilsint
4/8/16 BCD-Ziffern). Ich frage mich jedoch, ob Bibliotheken auf Produktionsebene die "Papier-Bleistift-Methode" nachahmen, da sie zu langsam ist.100,000,000,000,000,000 / 333,333,333,333
: Der erste Schritt ist der Vergleich100,000,000,000
mit333,333,333,333
. Da ersteres kleiner als letzteres ist, geht die Berechnung einfach zur nächsten Ziffer über. Der zweite Schritt besteht darin, den Quotienten von zu finden1,000,000,000,000 / 333,333,333,333
. Dies beinhaltet entweder eine Trial-and-Error-Multiplikation von333,333,333,333 * 1
(und* 2
,* 3
und* 4
) oder aufeinanderfolgende Subtraktionen in einer Schleife. Sehen Sie, wie langsam es ist? Ich glaube, dass effizientere Algorithmen existieren.Insgesamt ist die schnellste willkürliche Präzisionsbibliothek für allgemeine Zwecke GMP . Wenn Sie mit Gleitkommawerten arbeiten möchten, sehen Sie sich die MPFR- Bibliothek an. MPFR basiert auf GMP.
In Bezug auf die native Unterstützung für willkürliche Genauigkeit in anderen Sprachen verwendet Python aus Gründen der Lizenz, der Codegröße und der Codeportabilität eine eigene Implementierung. Mit dem GMPY- Modul kann Python auf die GMP-Bibliothek zugreifen.
casevh
quelle
Siehe http://ttmath.org
Kleine Nur-Header-Bibliothek mit Vorlagen für den kostenlosen persönlichen und kommerziellen Gebrauch.
quelle
Ich habe selbst keine Arithmetikbibliotheken mit willkürlicher Präzision miteinander verglichen, aber Leute, die sich mehr oder weniger einheitlich für GMP entschieden haben. Für das, was es wert ist, werden die willkürlichen Präzisions-Ganzzahlen in GHC Haskell und GNU Guile Scheme beide mit GMP implementiert, und die schnellste Implementierung des Pidigits-Benchmarks für das Sprach-Shootout basiert auf GMP.
quelle
Was ist mit Pari? Es basiert auf Top-GMP und bietet alle anderen Extras zu Operationen der Zahlentheorie, die Sie jemals benötigen werden (und viele symbolische Berechnungsmaterialien).
http://pari.math.u-bordeaux.fr/
quelle