GNU Multiple Precision Arithmetic Library
| gmp
| |
|---|---|
| Basisdaten
| |
| Entwickler | Free Software Foundation |
| Erscheinungsjahr | 1991[1] |
| Aktuelle Version | 6.3.0[2][3] (30. Juli 2023) |
| Betriebssystem | Unix, GNU/Linux |
| Programmiersprache | 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;
}
Weblinks
[Bearbeiten | Quelltext bearbeiten]- Offizielle GMP Website inklusive Dokumentation in HTML und PDF
- Offizielle Website des GNU-Projekts
Einzelnachweise
[Bearbeiten | Quelltext bearbeiten]- ↑ gmplib.org. „The first GMP release was made in 1991.“
- ↑ Torbjörn Granlund: GMP 6.3.0 released. 30. Juli 2023 (englisch, abgerufen am 30. Juli 2023).
- ↑ GMP 6.3 release notes.
- ↑ The GNU Multiple Precision (GMP) Library. Aufgerufen am 1. März 2017.
- ↑ The Mathematica Kernel: Issues in the Design and Implementation. Vorlesungstext. Aufgerufen am 14. November 2016.