Start · Sprachen · PHP · Referenz · gmp_sub

gmp_sub

Funktion

Subtrahiert zwei beliebig große Ganzzahlen und gibt das Ergebnis als <code>GMP</code>-Objekt zurück.

seit PHP 4.0.4 Kategorie: math

Signatur

gmp_sub(GMP|int|string $num1, GMP|int|string $num2): GMP

Beschreibung

gmp_sub() berechnet die Differenz zweier Ganzzahlen (num1 - num2) unter Verwendung der GNU Multiple Precision Arithmetic Library (GMP). Da GMP intern mit beliebig großen Ganzzahlen arbeitet, sind keine Überläufe möglich – auch nicht bei Zahlen, die weit über den Bereich von PHP-nativen int-Werten hinausgehen.

Die Funktion akzeptiert als Argumente GMP-Objekte (wie sie z. B. von gmp_init() oder anderen GMP-Funktionen zurückgegeben werden), aber auch gewöhnliche PHP-Integer oder numerische Strings. So kann man direkt mit Zahlenliteralen arbeiten, ohne sie zuvor explizit konvertieren zu müssen.

Das Ergebnis ist immer ein GMP-Objekt. Um daraus eine menschenlesbare Zahl zu erhalten, kann man es an gmp_strval() oder gmp_intval() übergeben. Negative Ergebnisse werden korrekt dargestellt.

Typische Anwendungsfälle sind kryptographische Berechnungen, exakte Finanzarithmetik mit sehr großen Zahlen sowie wissenschaftliche Berechnungen, bei denen der Standard-Integer-Bereich von PHP nicht ausreicht.

Parameter

Name Typ Default Beschreibung
$num1 Pflicht GMP|int|string Der Minuend – eine beliebig große Ganzzahl als GMP-Objekt, PHP-Integer oder numerischer String.
$num2 Pflicht GMP|int|string Der Subtrahend – eine beliebig große Ganzzahl als GMP-Objekt, PHP-Integer oder numerischer String.

Rückgabewert

Typ
GMP
Beschreibung
Gibt ein GMP-Objekt zurück, das die Differenz num1 - num2 enthält. Das Ergebnis kann positiv, null oder negativ sein.

Beispiele

Einfache Subtraktion mit Integer-Argumenten

<?php
$result = gmp_sub(100, 42);
echo gmp_strval($result); // 58

// Auch negative Ergebnisse werden korrekt dargestellt
$result2 = gmp_sub(10, 50);
echo PHP_EOL . gmp_strval($result2); // -40
58 -40

Subtraktion sehr großer Zahlen jenseits des PHP-Integer-Bereichs

<?php
// PHP_INT_MAX auf 64-Bit-Systemen: 9223372036854775807
$a = gmp_init('99999999999999999999999999999999');
$b = gmp_init('11111111111111111111111111111111');

$differenz = gmp_sub($a, $b);
echo gmp_strval($differenz);
88888888888888888888888888888888

Kombination mit anderen GMP-Funktionen in einer Berechnung

<?php
// Berechnung: (a * b) - (c + d) für sehr große Zahlen
$a = gmp_init('123456789012345678901234567890');
$b = gmp_init('2');
$c = gmp_init('100000000000000000000000000000');
$d = gmp_init('23456789012345678901234567890');

$produkt  = gmp_mul($a, $b);        // a * b
$summe    = gmp_add($c, $d);        // c + d
$ergebnis = gmp_sub($produkt, $summe); // (a*b) - (c+d)

echo gmp_strval($ergebnis);
123456789012345678901234567890

// Wichtig · Fallstricke

Voraussetzung: Die GMP-Erweiterung muss in PHP aktiviert sein. Auf vielen Systemen ist sie standardmäßig vorhanden; andernfalls muss PHP mit dem Flag --with-gmp kompiliert oder das entsprechende Paket (z. B. php-gmp) installiert werden.

Ab PHP 5.6 können GMP-Objekte direkt mit den Standard-Arithmetik-Operatoren (+, -, * usw.) verwendet werden, was den Code lesbarer machen kann. gmp_sub() bleibt jedoch für ältere Codebases und explizite Klarheit im Einsatz.

Übergibt man einen nicht-numerischen String, wird ein TypeError (PHP 8) bzw. ein Warnung ausgelöst. Dezimalzahlen (Floats) werden nicht unterstützt – GMP arbeitet ausschließlich mit ganzzahligen Werten.