GNU Multiple Precision Arithmetic Library
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änkungenDie 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. FunktionsumfangDer Funktionsumfang von GMP ist in sieben Kategorien unterteilt:
Beispiel zur VerwendungDie GMP besitzt drei Hauptdatentypen: #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 komportabler 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
Einzelnachweise
|