Zum Inhalt springen

GNU Multiple Precision Arithmetic Library

aus Wikipedia, der freien Enzyklopädie
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
Programmier­sprache 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">

  1. 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">

  1. 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">

  1. include <gmpxx.h> // C++-Wrapper für GMP
  2. 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]

Einzelnachweise[Bearbeiten]

<references />

Vorlage:Hinweisbaustein