Start · Sprachen · PHP · Referenz · is_nan

is_nan

Funktion

Prüft, ob eine Gleitkommazahl den speziellen Wert <code>NAN</code> (Not a Number) hat und gibt entsprechend <code>true</code> oder <code>false</code> zurück.

seit PHP 4.2.0 Kategorie: math

Signatur

is_nan(float $num): bool

Beschreibung

is_nan() prüft, ob der übergebene Gleitkommawert dem IEEE-754-Sonderwert NAN (Not a Number) entspricht. Dieser Wert entsteht in PHP zum Beispiel durch mathematisch undefinierte Operationen wie acos(2.0), sqrt(-1) oder log(-1). Ein direkter Vergleich mit NAN per === oder == ist dabei nicht möglich, da NAN !== NAN nach IEEE-754 immer true liefert – genau deshalb wird is_nan() benötigt.

Die Funktion ist besonders nützlich, wenn mathematische Berechnungen validiert werden sollen, bevor deren Ergebnis weiterverwendet wird. Ohne diese Prüfung könnten nachfolgende Berechnungen stille Fehler erzeugen, da sich NAN durch Operationen propagiert.

Verwandte Funktionen sind is_infinite() und is_finite(), die ebenfalls IEEE-754-Sonderwerte (positiv/negativ unendlich) prüfen. Alle drei Funktionen ergänzen sich und decken gemeinsam die vollständige Prüfung des Wertebereichs von Gleitkommazahlen ab.

Parameter

Name Typ Default Beschreibung
$num Pflicht float Die zu prüfende Gleitkommazahl. Wird ein anderer Typ übergeben, konvertiert PHP ihn implizit nach float.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn num den Wert NAN hat, andernfalls false.

Beispiele

Einfaches NAN-Erkennen nach ungültiger Berechnung

<?php
$value = acos(2.0); // Undefiniert: Arkuskosinus außerhalb von [-1, 1]

if (is_nan($value)) {
    echo "Das Ergebnis ist NAN – die Eingabe war ungültig.\n";
} else {
    echo "Ergebnis: " . $value . "\n";
}

$valid = acos(0.5);
if (is_nan($valid)) {
    echo "NAN\n";
} else {
    echo "Ergebnis: " . $valid . "\n"; // Gibt einen gültigen Wert aus
}
Das Ergebnis ist NAN – die Eingabe war ungültig. Ergebnis: 1.0471975511966

Warum direkter NAN-Vergleich nicht funktioniert

<?php
$nan = sqrt(-1); // Erzeugt NAN

// FALSCH: Direkter Vergleich funktioniert nicht
var_dump($nan == NAN);  // bool(false) — immer false nach IEEE-754!
var_dump($nan === NAN); // bool(false) — ebenfalls immer false!

// RICHTIG: is_nan() verwenden
var_dump(is_nan($nan)); // bool(true)
bool(false) bool(false) bool(true)

Eingabe-Validierung bei numerischen Berechnungen

<?php
function berechneWurzel(float $wert): string {
    $ergebnis = sqrt($wert);
    if (is_nan($ergebnis)) {
        return "Fehler: Wurzel aus negativer Zahl ist nicht definiert.";
    }
    if (is_infinite($ergebnis)) {
        return "Fehler: Ergebnis ist unendlich.";
    }
    return "Ergebnis: " . $ergebnis;
}

echo berechneWurzel(9.0) . "\n";
echo berechneWurzel(-4.0) . "\n";
Ergebnis: 3 Fehler: Wurzel aus negativer Zahl ist nicht definiert.

// Wichtig · Fallstricke

Wichtig: Da NAN nach dem IEEE-754-Standard mit keinem Wert – auch nicht mit sich selbst – gleich ist, führt ein Vergleich wie $x == NAN immer zu false. Die einzige zuverlässige Methode zur Erkennung von NAN ist is_nan().

Die PHP-Konstante NAN ist seit PHP 4.0 verfügbar und liefert den entsprechenden Gleitkommawert; sie sollte jedoch niemals direkt für Vergleiche verwendet werden.

Bei der Übergabe von Integer-Werten erfolgt eine implizite Umwandlung nach float; normale Integer-Werte und auch INF/-INF werden dabei korrekt als Nicht-NAN erkannt.