GNU Multiple Precision Arithmetic Library
| {{#if: gmp | gmp | {{#invoke:WLink|getArticleBase}} }}
{{#if: | | ||||||||
|---|---|---|---|---|---|---|---|---|
colspan="2" class="notheme" style="text-align:center; background:#Vorlage:Standardfarbe; color:#202122;" | |
{{#if: {{#invoke:Wikidata|claim|P154}} |
| ||||||||
[[Datei:{{#invoke:Wikidata|claim|P154}}|150px]]
}} }}{{#if: | | ||||||||
| {{#if: | }}| }} | ||||||||
| Basisdaten
{{#if: | | ||||||||
| Hauptentwickler |
{{#if: {{#invoke:Wikidata|claim|P126}} |
| |||||||
| Maintainer | claim|P126|parameter=link|references=ja|list=, }}
}} }}{{#if: Free Software Foundation | | |||||||
| Entwickler | Free Software Foundation |
{{#if: {{#invoke:Wikidata|claim|P178}} |
| |||||||
| Entwickler | claim|P178|parameter=link|references=ja|list=, }}
}} }}{{#if: | | |||||||
| Erscheinungsjahr |
{{#if: {{#invoke:Wikidata|claim|P577}} |
| |||||||
| Erscheinungsjahr | claim|P577|references=ja|list=, }} |
{{#if: {{#invoke:Wikidata|claim|P571}} |
| |||||||
| Erscheinungsjahr | claim|P571|references=ja|list=, }}
}} }} }}{{#ifeq: | KEINE_ANGABE || {{#if: | | |||||||
| Aktuelle Version | ({{#if: | Vorlage:Datum – die Form mit drei unbenannten Parametern oder anderen einzelnen Zeiteinheiten ist veraltet und wird nicht mehr unterstützt. Bitte gib das Datum einfach im Klartext an. |
format | {{{AktuelleVersionFreigabeDatum}}} | {{#timefl:now|date}}}} | {{{2}}} | T._Monat JJJJ}} | lang= {{#switch: | -|=de | #default=de-AT
}} }} }}) }} |
{{#if: {{#invoke:Wikidata|claim|P348|P548|!Q3295609,Q51930650,Q2122918,Q21727724,Q1072356,Q6736813}} |
|
| Aktuelle Version | claim|P348|P548|!Q3295609,Q51930650,Q2122918,Q21727724,Q1072356,Q6736813|references=ja}} {{#if: {{#invoke:Wikidata|claim|P348|P548|!Q3295609,Q51930650,Q2122918,Q21727724,Q1072356,Q6736813|qualifier=P577}} | ({{#invoke:Wikidata|claim|P348|P548|!Q3295609,Q51930650,Q2122918,Q21727724,Q1072356,Q6736813|qualifier=P577}}) }}}}}} }}{{#ifeq: {{{AktuelleVorabVersion}}} | KEINE_ANGABE || {{#if: | | |||||||
| Aktuelle Vorabversion | ({{#if: | Vorlage:Datum – die Form mit drei unbenannten Parametern oder anderen einzelnen Zeiteinheiten ist veraltet und wird nicht mehr unterstützt. Bitte gib das Datum einfach im Klartext an. |
format | {{{AktuelleVorabVersionFreigabeDatum}}} | {{#timefl:now|date}}}} | {{{2}}} | T._Monat JJJJ}} | lang= {{#switch: | -|=de | #default=de-AT
}} }} }}) }} |
{{#if: {{#invoke:Wikidata|claim|P348|P548|Q1072356,Q51930650,Q3295609,Q2122918,Q21727724}} |
|
| Aktuelle Vorabversion | claim|P348|P548|Q1072356,Q51930650,Q3295609,Q2122918,Q21727724|references=ja}} {{#if: {{#invoke:Wikidata|claim|P348|P548|Q1072356,Q51930650,Q3295609,Q2122918,Q21727724|qualifier=P577}} | ({{#invoke:Wikidata|claim|P348|P548|Q1072356,Q51930650,Q3295609,Q2122918,Q21727724|qualifier=P577}}) }}}}}} }}{{#if: | | |||||||
| Ausführungsumgebung |
{{#if: Unix, GNU/Linux |
| |||||||
| Betriebssystem | Unix, GNU/Linux |
{{#if: {{#invoke:Wikidata|claim|P306}} |
| |||||||
| Betriebssystem | claim|P306|parameter=link|references=ja|list=, }}
}} }} }}{{#if: | | |||||||
| Programmiersprache |
{{#if: {{#invoke:Wikidata|claim|P277}} |
| |||||||
| Programmiersprache | claim|P277|parameter=link|references=ja|list=, }}
}} }}{{#if: Standard C Library | | |||||||
| Kategorie | Standard C Library
}}{{#if: LGPL | | |||||||
| Lizenz | LGPL |
{{#if: {{#invoke:Wikidata|claim|P275}} |
| |||||||
| Lizenz | claim|P275|parameter=link|references=ja|list=, }}
}} }}{{#if: | | |||||||
| deutschsprachig | faculty|}} | ja | nein }}
}}{{#if: | | |||||||
| Sonstiges | {{{Sonstiges}}}
}}{{#if: www.gmplib.org | | |||||||
www.gmplib.org |
{{#if: {{#invoke:Wikidata|claim|P856|notdeprecated=1}} |
| ||||||||
{{#invoke: WLink | formatURL | {{#invoke:Wikidata|claim|P856|parameter=link|notdeprecated=1}}}}
}} }}{{#if: | | ||||||||
| Dateien | [[c:Category:Created with |]]
}} | |||||||
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
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
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 {{#if:trim|Berkeley MP Projekt}}.
Beispiel zur Verwendung
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
- Offizielle GMP Website inklusive Dokumentation in HTML und PDF
- Offizielle Website des GNU-Projekts
Einzelnachweise
<references />
{{#ifeq: s | p | | {{#if: 7859121-1 | |
}} }}{{#ifeq:||{{#if: | [[Kategorie:Wikipedia:GND fehlt {{#invoke:Str|left|{{{GNDCheck}}}|7}}]] }}{{#if: | {{#if: | | }} }} }}{{#if: | {{#ifeq: 0 | 2 | | }} }}{{#if: | {{#ifeq: 0 | 2 | | }} }}{{#ifeq: s | p | {{#if: 7859121-1 | | {{#if: {{#statements:P227}} | | }} }} }}{{#ifeq: s | p | {{#if: 7859121-1 | {{#if: {{#invoke:Wikidata|pageId}} | {{#if: {{#statements:P227}} | | }} }} }} }}{{#ifeq: s | p | {{#if: | | {{#if: {{#statements:P244}} | | }} }} }}{{#ifeq: s | p | {{#if: | {{#if: {{#invoke:Wikidata|pageId}} | {{#if: {{#statements:P244}} | | }} }} }} }}{{#ifeq: s | p | {{#if: | | {{#if: {{#statements:P214}} | | }} }} }}{{#ifeq: s | p | {{#if: | {{#if: {{#invoke:Wikidata|pageId}} | {{#if: {{#statements:P214}} | | }} }} }} }}Vorlage:Wikidata-Registrierung
- Wikipedia:Vorlagenfehler/Parameter:Datum
- Wikipedia:GND fehlt
- Wikipedia:Normdaten-TYP falsch oder fehlend
- Wikipedia:GND in Wikipedia fehlt, in Wikidata vorhanden
- Wikipedia:GND in Wikipedia vorhanden, fehlt jedoch in Wikidata
- Wikipedia:LCCN in Wikipedia fehlt, in Wikidata vorhanden
- Wikipedia:LCCN in Wikipedia vorhanden, fehlt jedoch in Wikidata
- Wikipedia:VIAF in Wikipedia fehlt, in Wikidata vorhanden
- Wikipedia:VIAF in Wikipedia vorhanden, fehlt jedoch in Wikidata
- C-Bibliothek
- Computerarithmetik
- GNU-Paket