2009-08-12 13 views
2

Ich schreibe eine Anwendung, die eine Menge Manipulation mit Dezimal Zahlen (z. B. 57.65). Da Multiplikationen und Divisionen ihre Genauigkeit schnell verschlechtern, möchte ich die Zahlen in einer Klasse speichern, die ihre Genauigkeit nach der Manipulation bewahrt, anstatt sich auf Float und Double zu verlassen.Gibt es eine Bibliotheksklasse zur Darstellung von Fließkommazahlen?

Ich spreche über etwas wie folgt aus:

class FloatingPointNumber { 
private: 
    long m_mantissa; 
    int m_dps; // decimal points 
    // so for example 57.65 would be represented as m_mantissa=5765, m_dps=2 
public: 
    // Overloaded function for addition 
    FloatingPointNumber operator+(FloatingPointNumber n); 
    // Other operator overloads follow 
} 

Während es möglich ist für mich eine solche Klasse zu schreiben, fühlt es sich ein bisschen wie das Rad neu zu erfinden, und ich bin sicher, dass es eine Bibliotheksklasse sein müssen Irgendwo, was das tut (obwohl das in STL nicht zu existieren scheint).

Kennt jemand eine solche Bibliothek? Danke vielmals.

+0

Ja, der Datentyp, den Sie suchen, heißt Dezimal. Es ist jedoch kein Fließkomma-Typ. Es ist der Datentyp, der zum Beispiel bei der Darstellung von Geld verwendet wird. – Skurmedel

+1

C++ hat keine Dezimalzahl. – GManNickG

+0

Nein, ich habe nie gesagt, dass es hat. – Skurmedel

Antwort

3

Es gibt eine Liste von Bibliotheken here.

Ich habe noch nie einen von ihnen versucht, also kann ich keinen einzigen empfehlen, aber this one ist Teil des GNU-Projekts, also kann es nicht halb so schlimm sein.

5

Meinst du sowas?

#include "ttmath/ttmath.h" 
#include <iostream> 

int main() 
{ 
    // bigdouble consists of 1024*4 bytes for the mantissa 
    // and 256*4 bytes for the exponent. 
    // This is because my machine is 32-bit! 
    typedef ttmath::Big<1024, 256> bigdouble; // <Mantissa, Exponent> 

    bigdouble x = 5.05544; 
    bigdouble y = "54145454.15484854120248541841854158417"; 
    bigdouble z = x * y * 0.01; 

    std::cout << z; 

    return 0; 
} 

Sie können die Anzahl der Maschinenworte in den Mantisse angeben und den Exponenten wie Sie mögen. Ich habe TTMath verwendet, um Project Euler Rätsel zu lösen, und ich bin wirklich zufrieden damit. Ich denke, es ist relativ stabil und der Autor ist sehr freundlich, wenn Sie Fragen haben.


EDIT :: ich auch MAPM in der Vergangenheit verwendet haben. Es stellt große Schwimmer in Basis 100 dar, also würde es kein Problem geben, Dezimalzahlen zu Basis 100 zu konvertieren, im Gegensatz zu Basis 2. TTMAT verwendet Basis 2, um große Gleitkommazahlen darzustellen. Es ist seit 2000 stabil, wie die Bibliotheksseite behauptet. Es wurde in vielen Anwendungen verwendet, wie Sie auf der Bibliotheksseite sehen können. Es ist eine C-Bibliothek mit einem netten C++ - Wrapper.

MAPM nextPrime(){ 

    static MAPM prime = 3; 
    MAPM retPrime = prime; 

    prime += 2; 
    while(isPrime(prime) == false) 
     prime += 2; 

    return retPrime; 
} 

BTW, wenn Sie in GMP interessiert sind und Sie VS verwenden, dann können Sie die MPIR überprüfen, die für Windows-GMP-Port ist;) für mich finde ich TTMath mehr als angenehm und einfacher/schneller als alles, was ich probiert habe, weil die Bibliothek Stapelzuweisungen stapelt, ohne den Heap trotzdem zu berühren. Im Grunde handelt es sich nicht um eine beliebige Präzisions-Bibliothek. Sie geben die Genauigkeit zur Kompilierungszeit an, wie oben gezeigt.

Verwandte Themen