GNU Multiple Precision Arithmetic Library
| gmp
| |
|---|---|
| [[Datei:Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value)|150px]] | |
| Basisdaten
| |
| Maintainer | Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value) |
| Entwickler | Free Software Foundation |
| Erscheinungsjahr | Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value) |
| Aktuelle Version | Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value) (Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value)) |
| Aktuelle Vorabversion | Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value) (Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value)) |
| Betriebssystem | Unix, GNU/Linux |
| Programmiersprache | Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value) |
| Kategorie | Standard C Library |
| Lizenz | LGPL |
| www.gmplib.org | |
Die GNU Multiple Precision Arithmetic Library (GMP) ist eine Programmierbibliothek, die arithmetische Funktionen für beliebig genaue/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. GMP ist offizieller Teil des GNU-Projekts, steht unter der LGPL und ist somit freie Software. Computeralgebrasysteme, die GMP verwenden, sind beispielsweise Maple<ref>The GNU Multiple Precision (GMP) Library. Aufgerufen am 1. März 2017.</ref> und Mathematica<ref>The Mathematica Kernel: Issues in the Design and Implementation. Vorlesungstext. Aufgerufen am 14. November 2016.</ref>.
Beschränkungen[Bearbeiten]
Die Möglichkeiten von GMP in Bezug auf die Größe der Zahlen sind einzig und allein durch den im Computer verfügbaren Arbeitsspeicher bzw. virtuellen Speicher begrenzt.
Funktionsumfang[Bearbeiten]
Der Funktionsumfang von GMP ist in sieben Kategorien unterteilt:
- Arithmetische und logische Funktionen für vorzeichenbehaftete Ganzzahlen (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 Ganzzahlen, für die der Benutzer die Speicherverwaltung selbst implementieren muss,
- Funktionen zum Runden von Gleitkommazahlen und
- Funktionen für Kompatibilität zum Berkeley MP Projekt.
Beispiel zur Verwendung[Bearbeiten]
Die GMP besitzt drei Hauptdatentypen: mpz_t für beliebig große Integer, mpf_t für beliebig große Gleitkommazahlen mit änderbarer, auch extrem großer Präzision und mpq_t für die 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 aufgerufen werden (siehe Listing). Der folgende C99-Quelltext veranschaulicht den grundlegenden Gebrauch der GMP:
<syntaxhighlight lang="c" style="font-size:85%; max-width:850px">
- include <gmp.h>
int main (void) {
mpz_t a; // deklariere GMP-Ganzzahlvariable mpf_t b; // deklariere GMP-Gleitkommavariable mpq_t c; // deklariere GMP-Bruchvariable
mpz_init(a); // initialisiere GMP-Ganzzahlvariable mpf_init(b); // initialisiere GMP-Gleitkommavariable 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 Möglichkeit, eine MPZ-Variable zu setzen, falls der
// Wertebereich von unsigned int nicht ausreicht. 10 ist die Basis.
mpf_set_d (b, 3.14159265358); // GMP-Gleitkommavariable 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 durchgeführt werden, um gemeinsame Teiler zu entfernen
// und die Vorzeichen zu berichtigen
return 0;
} </syntaxhighlight>
Wichtige Funktionen der GMP sind unter anderem:
<syntaxhighlight lang="c" style="font-size:85%; max-width:850px">
- include <gmp.h>
int main (void) {
// Die vorher deklarierten Variablen seien geltend // Weitestgehend identische Funktionen sind auch für mpf und mpq verfügbar (einfach Präfix austauschen) mpz_t d, e; mpz_init_set_str (d, "133742", 10); // kombinierte Initialisierungs- und Zuweisungsfunktion mpz_init (e);
mpz_add (e, a, d); // c = a * d
gmp_printf("e = %Zd\n", e); // gmp_printf() ist äquivalent zu printf(), gibt aber GMP-Variablen aus
mpz_mul (a, e, d); // a = e * d
mpz_add_ui(d, a, 421337); // d = a + der unsigned-long-int-Wert 421337
gmp_printf("d = %Zd\n",d);
return 0;
} </syntaxhighlight>
oder komfortabler in C++ durch den C++-Wrapper:
<syntaxhighlight lang="cpp" style="font-size:85%; max-width:850px">
- include <gmpxx.h> // C++-Wrapper für GMP
- include <iostream>
int main () {
mpz_class d("133742");
mpz_class e; // initialisiert sich selbst mit 0
e = a + d;
std::cout << e << "\n"; // gmpxx bietet operator<< für mpz_class
a = e * d;
d = a + 421337UL;
std::cout << "d = " << d << "\n";
return 0;
} </syntaxhighlight>
Weblinks[Bearbeiten]
- Offizielle GMP Website inklusive Dokumentation in HTML und PDF
- Offizielle Website des GNU-Projekts
Einzelnachweise[Bearbeiten]
<references />