2016-03-31 5 views
0

Ich versuche, ein C++ - Programm zu verbessern, indem ich die GMP (GNU Multiple Precision Arithmetic Library) benutze.wie man epsilon von mpf_class berechnet

Es gibt eine Zählervariable, die periodisch um das Ergebnis einer Berechnung vom Typ double erhöht wird. Die Addition geschieht innerhalb einer ISR (Interrupt Service Routine), deshalb sollte sie schnell sein.

Bisher ist die Zählervariable vom Typ double, was ein Problem verursacht. Einige Geräte (die seit Jahren laufen) erreichen einen Punkt, an dem jede Addition unter Absorption fällt, so dass nichts mehr passiert. Andere Geräte beginnen bereits kleinere Zusätze zu verwerfen.

Weil es Zeit ist, es zu verbessern, indem Sie stattdessen mpf_class doppelt verwenden. Aber um die Größe der mpf_class richtig einzustellen, muss ich die & epsil; (Epsilon).

Meine Frage ist: Wie kann ich das Epsilon eines mpf_class Objekts berechnen?

Ein Beispiel (C++) dieser Berechnung wäre großartig.

Antwort

0

Der MPF-Typ in GMP bietet keine exakte Radix-2-Darstellung. Die angeforderte Genauigkeit wird durch die Anzahl der Bits im zugrunde liegenden Array-Element aufgerundet und dann wird mindestens ein zusätzliches Element hinzugefügt. Wenn Sie bei einem typischen 32-Bit-System eine Genauigkeit von 53 anfordern, werden die tatsächlichen Werte mit 65 bis 96 Bit berechnet. (Technisch verwendet der mpf-Typ in diesem Fall die Radix 2^32-Arithmetik).

Ich würde empfehlen, stattdessen die MPFR (Multiple Precision Gleitkomma mit Rundung) Bibliothek zu betrachten. Es verwendet die GMP-Bibliothek für die zugrunde liegenden Berechnungen, bietet aber ein besser vorhersagbares Verhalten. Die Verwendung von MPFR wird durch einen Hinweis in der GMP-Dokumentation empfohlen.

+0

ok es ist nicht wichtig für mich zu wissen, ob mein system mehr speicher benötigt. Ich interessiere mich für das größtmögliche Epsilon. Ich muss nur überprüfen, ob es die Anforderungen erfüllt. Neben mpfr ist installiert, ich kann es verwenden, wenn ich dies tun muss. Eine Lösung für mpfr wäre in Ordnung. – Sorko