Zum Inhalt springen

GNU Multiple Precision Arithmetic Library

aus Wikipedia, der freien Enzyklopädie
gmp
Basisdaten
Entwickler Free Software Foundation
Erscheinungsjahr 1991[1]
Aktuelle Version 6.3.0[2][3]
(30. Juli 2023)
Betriebssystem Unix, GNU/Linux
Programmier­sprache C, Assemblersprache
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[4] und Mathematica[5].

Beschränkungen

[Bearbeiten | Quelltext 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 | Quelltext 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 | Quelltext 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:

#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;
}

Wichtige Funktionen der GMP sind unter anderem:

#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;
}

oder komfortabler in C++ durch den C++-Wrapper:

#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;
}

Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]
  1. ↑ gmplib.org. „The first GMP release was made in 1991.“
  2. ↑ Torbjörn Granlund: GMP 6.3.0 released. 30. Juli 2023 (englisch, abgerufen am 30. Juli 2023).
  3. ↑ GMP 6.3 release notes.
  4. ↑ The GNU Multiple Precision (GMP) Library. Aufgerufen am 1. März 2017.
  5. ↑ The Mathematica Kernel: Issues in the Design and Implementation. Vorlesungstext. Aufgerufen am 14. November 2016.