- GNU Multiple Precision Arithmetic Library
-
Die GNU Multiple Precision Arithmetic Library ist eine Programmierbibliothek, die arithmetische Funktionen für beliebig große Zahlen implementiert. Die erste Version von GMP erschien 1991. Seitdem wird die Bibliothek ständig erweitert und verbessert und in einem jährlichen Release herausgegeben (aktuelles Release: Version 5.0.2). GMP ist offizieller Teil des GNU-Projekts, steht unter der LGPL und ist somit freie Software.
Inhaltsverzeichnis
Beschränkungen
Die Möglichkeiten von GMP in Bezug auf die Größe der Zahlen ist einzig und allein durch den im Computer verfügbaren Arbeitsspeicher bzw. virtuellen Speicher begrenzt. Trotz der Emulation der Hardwareberechnungen in Form von Softwarealgorithmen bleibt GMP verhältnismäßig schnell, da an vielen Stellen mit Hilfe von Assembleranweisungen optimiert wurde.
Funktionsumfang
Der Funktionsumfang von GMP ist in sieben Kategorien unterteilt.
- Arithmetische und logische Funktionen für vorzeichenbehaftete Integer (ca. 140 Funktionen)
- Arithmetische Funktionen für rationale Zahlen (ca. 35 Funktionen)
- Arithmetische Funktionen für Gleitkommazahlen (ca. 65 Funktionen)
- C++ Wrapper-Klassen für obige Funktionen
- Arithmetische Funktionen für vorzeichenlose Integer, für die der Benutzer die Speicherverwaltung selbst implementieren muss
- Funktionen zur Rundung von Gleitkommazahlen
- Funktionen für die Kompatibilität zum Berkeley MP Projekt
Beispiel zur Verwendung
Die GMP besitzt drei Hauptdatentypen:
mpz_t
(beliebig große Integer),mpf_t
(beliebig große Gleitkommazahl mit änderbarer, auch extrem großer Präzision) undmpq_t
(Darstellung von Zahlen als Bruch). Den GMP-Variablen können nicht einfach Werte zugewiesen werden (wie bei normalen Datentypen), sondern es müssen spezielle Funktionen gerufen werden (siehe Listing). Der folgende Quelltext veranschaulicht den grundlegenden Gebrauch der GMP:# include <gmp.h> int main(void) { mpz_t a; // Deklariere GMP-Ganzzahlvariable mpf_t b; // Deklariere GMP-Fliesskommavariable mpq_t c; // Deklariere GMP-Bruchvariable mpz_init(a); // Initialisiere GMP-Ganzzahlvariable mpf_init(b); // Initialisiere GMP-Fliesskommavariable mpq_init(c); // Initialisiere GMP-Bruchvariable mpz_set_ui(a,1337); // Setze GMP-Ganzzahlvariable auf einen unsigned-integer-Wert mpz_set_str(a,"4242424242",10); // Andere Moeglichkeit, eine MPZ-Variable zu setzen, z.B. // falls der Wertebereich von unsigned int zu klein ist. 10 ist die Basis mpf_set_d(b,3.14159265358); // GMP-Fliessvariable auf einen double-Wert setzen mpf_set_str(b,"3.141592653589793238462643383279502",10); // Wie mpz_set_str(); mpq_set_ui(c,23423,11123); // Setze c auf den Wert des Bruchs (23423/11123) mpq_canonicalize(c); // Muss durchgefuehrt werden, um gemeinsame Teiler zu entfernen // und die Vorzeichen zu berichtigen return(0); }
Wichtige Funktionen der GMP sind unter anderem:
# include <gmp.h> int main(void) { // Die vorher deklarierten Variablen seien geltend // Weitestgehend identische Funktionen sind auch fuer mpf und mpq verfuegbar (einfach Praefix austauschen) mpz_t d,e; mpz_init_set_str(d,"133742",10); // Kombinierte Initialisierungs- und Zuweisungsfunktion mpz_init(e); mpz_add(e,a,d); // a und d addieren und das Ergebnis der Variable e zuweisen gmp_printf("%Zd\n",e); // gmp_printf() ist aequivalent zu printf(), gibt nur eben GMP-Variablen aus mpz_mul(a,e,d); // e und d multiplizieren und a zuweisen mpz_add_ui(d,a,421337); // a und den unsigned-long-int-Wert 421337 addieren und d zuweisen }
Weblinks
Kategorien:- Bibliothek (Programmierung)
- Computerarithmetik
- GNU
Wikimedia Foundation.