Start · Sprachen · PHP · Referenz · fpow

fpow

Funktion

Berechnet <code>base</code> hoch <code>exp</code> strikt nach IEEE 754 – im Gegensatz zu <code>**</code> und <code>pow()</code> immer als Fließkommaoperation.

seit PHP 8.4.0 Kategorie: math

Signatur

fpow(float $base, float $exp): float

Beschreibung

fpow() potenziert eine Basis (base) mit einem Exponenten (exp) und liefert das Ergebnis als float. Die Funktion verhält sich dabei exakt so, wie es der IEEE-754-Standard für Fließkomma-Arithmetik vorschreibt – insbesondere bei Sonderfällen wie NAN, INF oder negativen Basen mit nicht-ganzzahligen Exponenten.

Der wesentliche Unterschied zu pow() und dem **-Operator liegt darin, dass diese je nach Typ der Operanden auch ganzzahlige Ergebnisse (int) zurückgeben können. fpow() gibt hingegen immer einen float zurück und folgt damit dem IEEE-754-Standard ohne Sonderbehandlung von Integer-Pfaden. Das macht das Verhalten vorhersehbar und konsistent, etwa in wissenschaftlichen Berechnungen oder wenn das Ergebnis zwingend ein float sein muss.

Typische Sonderfälle gemäß IEEE 754: fpow(0.0, 0.0) ergibt 1.0, fpow(-INF, 0.5) ergibt INF, und fpow(-1.0, NAN) ergibt NAN. Diese Sonderfälle werden nicht als Fehler behandelt, sondern produzieren definierte Ergebnisse.

Die Funktion ist besonders nützlich, wenn IEEE-754-Konformität explizit gefordert ist, z. B. in wissenschaftlichen oder finanzmathematischen Anwendungen, bei Interoperabilität mit anderen Systemen oder wenn der Rückgabetyp float für nachfolgende Operationen garantiert sein muss.

Parameter

Name Typ Default Beschreibung
$base Pflicht float Die Basis der Potenzierung. Darf auch INF, -INF oder NAN sein.
$exp Pflicht float Der Exponent, mit dem base potenziert wird. Darf auch nicht-ganzzahlig, negativ, INF oder NAN sein.

Rückgabewert

Typ
float
Beschreibung
Gibt stets einen float zurück – das Ergebnis von base hoch exp gemäß IEEE 754. Bei ungültigen Kombinationen (z. B. negative Basis mit nicht-ganzzahligem Exponent) wird NAN zurückgegeben, bei Überlauf INF.

Beispiele

Grundlegende Potenzierung mit fpow()

<?php
// Einfache Potenzierung
var_dump(fpow(2.0, 10.0));   // float(1024)
var_dump(fpow(9.0, 0.5));    // float(3) – Quadratwurzel
var_dump(fpow(2.0, -3.0));   // float(0.125)

// Ergebnis ist IMMER float – auch bei "ganzzahligen" Resultaten
$result = fpow(3.0, 3.0);
var_dump($result);           // float(27)
float(1024) float(3) float(0.125) float(27)

IEEE-754-Sonderfälle

<?php
// 0^0 ist per IEEE 754 definiert als 1
var_dump(fpow(0.0, 0.0));          // float(1)

// Negative Basis mit nicht-ganzzahligem Exponent => NAN
var_dump(fpow(-2.0, 0.5));         // float(NAN)

// Überläufe
var_dump(fpow(INF, 2.0));          // float(INF)
var_dump(fpow(0.0, -1.0));         // float(INF)

// NAN-Propagation
var_dump(fpow(NAN, 2.0));          // float(NAN)
var_dump(fpow(2.0, NAN));          // float(NAN)
float(1) float(NAN) float(INF) float(INF) float(NAN) float(NAN)

Vergleich fpow() vs. pow() bei gemischten Typen

<?php
// pow() kann int zurückgeben
$a = pow(2, 8);
var_dump($a);          // int(256)

// fpow() gibt immer float zurück
$b = fpow(2.0, 8.0);
var_dump($b);          // float(256)

// Wenn ein float-Rückgabewert für Typkonsistenz benötigt wird:
function berechneZins(float $kapital, float $jahre): float {
    return $kapital * fpow(1.05, $jahre);
}
echo berechneZins(1000.0, 10.0); // 1628.8946267774
int(256) float(256) 1628.8946267774

// Wichtig · Fallstricke

Neu in PHP 8.4: fpow() wurde eingeführt, um eine explizit IEEE-754-konforme Alternative zu pow() und ** bereitzustellen. In älteren PHP-Versionen steht die Funktion nicht zur Verfügung.

Wer strikte Typisierung (declare(strict_types=1)) verwendet und einen garantierten float-Rückgabewert benötigt, sollte fpow() gegenüber pow() bevorzugen, da pow() je nach Eingabetyp int oder float zurückgibt.

Bei sicherheitskritischen Berechnungen (z. B. kryptografischen Operationen mit großen Zahlen) ist fpow() wegen der begrenzten Fließkommagenauigkeit ungeeignet – dort sollte gmp_pow() oder die BCMath-Erweiterung verwendet werden.

Siehe auch