W3docs

is_nan()

Die Funktion is_nan() in PHP prüft, ob ein Gleitkommawert NaN (Not a Number) ist. Erfahren Sie, wie und wann Sie sie einsetzen.

Die Funktion is_nan() in PHP prüft, ob ein Gleitkommawert NaN („Not a Number") ist — der spezielle Wert, den der IEEE-754-Standard für mathematisch undefinierte Ergebnisse verwendet. Diese Seite erklärt, was NaN ist, warum man es nicht mit == testen kann, wie is_nan() dieses Problem löst und welche Fallstricke zu beachten sind.

Syntax

is_nan(float $num): bool

Die Funktion erwartet ein einzelnes Gleitkomma-Argument und gibt true zurück, wenn der Wert NaN ist, und false für jede normale Zahl (einschließlich 0.0 und Unendlich).

Was ist NaN?

NaN ist ein Platzhalter, der bei Gleitkommaberechnungen entsteht, wenn eine Operation kein reelles, darstellbares Ergebnis hat. Häufige Quellen sind:

  • acos(1.5) — der Arkuskosinus ist nur für Eingaben zwischen -1 und 1 definiert.
  • sqrt(-1) — es gibt keine reelle Quadratwurzel einer negativen Zahl.
  • log(-1) — der natürliche Logarithmus ist für nicht-positive Zahlen undefiniert.
  • fdiv(0, 0) — Division von null durch null im Gleitkomma-Stil.
  • Die eingebaute Konstante NAN selbst.

NaN hat den Typ double (PHPs float-Typ), sodass es durch Code schlüpft, der nur is_float() prüft. Genau deshalb existiert ein dedizierter Test.

Hinweis: Das direkte Schreiben von 0 / 0 wirft in PHP 8+ einen DivisionByZeroError, es gibt also nicht stillschweigend NaN zurück. Verwenden Sie fdiv(0, 0), wenn Sie das NaN-Ergebnis im Gleitkomma-Stil statt einer Exception möchten.

Warum man NaN nicht mit == vergleichen kann

Die wichtigste Eigenschaft von NaN ist, dass es mit nichts gleich ist, nicht einmal mit sich selbst. Jeder Vergleich mit NaN gibt false zurück:

<?php
var_dump(NAN == NAN);   // bool(false)
var_dump(NAN === NAN);  // bool(false)
var_dump(NAN < 1);      // bool(false)
var_dump(NAN > 1);      // bool(false)
?>

Da $x == NAN immer false ist, kann NaN nicht per Vergleich erkannt werden. is_nan() ist der korrekte — und einzig zuverlässige — Weg zur Prüfung.

Verwendung der Funktion is_nan()

Man übergibt einen Wert (üblicherweise das Ergebnis einer Berechnung) an is_nan() und verzweigt anhand des zurückgegebenen boolean-Werts:

php— editable, runs on the server

Hier ist acos(1.5) undefiniert, gibt also NaN zurück, is_nan() gibt true zurück und das Skript gibt The number is not a number aus.

Validierung eines Berechnungsergebnisses

Ein typischer Praxiseinsatz ist die Absicherung von Ausgaben: Eine Berechnung durchführen und das Ergebnis dann nicht anzeigen oder speichern, wenn es NaN ist.

<?php
function safeRatio(float $a, float $b): string {
    $result = $a * sqrt($b); // sqrt of a negative number yields NaN

    if (is_nan($result)) {
        return "Invalid input: result is not a number";
    }

    return "Result: " . $result;
}

echo safeRatio(2, 9), PHP_EOL;   // Result: 6
echo safeRatio(2, -9), PHP_EOL;  // Invalid input: result is not a number
?>

is_nan() im Vergleich mit verwandten Prüfungen

Wertis_nan()is_finite()is_infinite()
5.0falsetruefalse
acos(1.5) (NaN)truefalsefalse
INFfalsefalsetrue

Verwenden Sie is_finite(), um zu bestätigen, dass eine Zahl ein normaler, verwendbarer Wert ist, is_infinite(), um einen Überlauf auf Unendlich zu erkennen, und is_nan() speziell für den Fall eines „undefinierten Ergebnisses". Zur Validierung von benutzerdefinierten Zeichenketten, bevor sie eine Berechnung erreichen, empfiehlt sich is_numeric().

Fazit

is_nan() ist der zuverlässige Weg, den IEEE-754-NaN-Wert zu erkennen, den Gleichheitsoperatoren niemals erfassen können, da NaN nicht gleich sich selbst ist. Verwenden Sie die Funktion, um die Ausgabe von Mathematikfunktionen wie acos(), sqrt() und log() zu validieren, bevor Sie dem Ergebnis vertrauen, und kombinieren Sie sie mit is_finite() und is_float(), wenn Sie ein vollständiges Bild des Zustands eines float-Werts benötigen.

Übungen

Übung
Was macht die Funktion is_nan() in PHP?
Was macht die Funktion is_nan() in PHP?
Was this page helpful?