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.