W3docs

is_nan()

Découvrez la fonction is_nan() en PHP, utilisée pour déterminer si une valeur est NaN (Not a Number) selon la norme IEEE 754.

La fonction is_nan() en PHP indique si une valeur en virgule flottante est NaN (« Not a Number ») — la valeur spéciale que la norme IEEE 754 utilise pour les résultats mathématiquement indéfinis. Cette page explique ce qu'est NaN, pourquoi on ne peut pas le tester avec ==, comment is_nan() résout ce problème, et les pièges à éviter.

Syntaxe

is_nan(float $num): bool

Elle prend un seul argument en virgule flottante et renvoie true si cette valeur est NaN, et false pour tout nombre ordinaire (y compris 0.0 et l'infini).

Qu'est-ce que NaN ?

NaN est un résultat produit par le calcul en virgule flottante lorsqu'une opération n'a pas de réponse réelle et représentable. Les sources courantes sont :

  • acos(1.5) — l'arc cosinus n'est défini que pour des entrées comprises entre -1 et 1.
  • sqrt(-1) — il n'existe pas de racine carrée réelle d'un nombre négatif.
  • log(-1) — le logarithme naturel est indéfini pour les nombres non positifs.
  • fdiv(0, 0) — diviser zéro par zéro en mode virgule flottante.
  • La constante intégrée NAN elle-même.

NaN a le type double (le type float de PHP), il passe donc à travers le code qui ne vérifie que is_float(). C'est précisément pourquoi un test dédié existe.

Remarque : écrire 0 / 0 directement lève une DivisionByZeroError en PHP 8+, donc cela ne retourne pas silencieusement NaN. Utilisez fdiv(0, 0) lorsque vous souhaitez obtenir le résultat NaN en virgule flottante plutôt qu'une exception.

Pourquoi on ne peut pas comparer NaN avec ==

La propriété la plus importante de NaN est qu'il n'est égal à rien, pas même à lui-même. Toute comparaison impliquant NaN renvoie false :

<?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)
?>

Comme $x == NAN est toujours faux, vous ne pouvez pas détecter NaN par comparaison. is_nan() est la méthode correcte — et la seule fiable — pour vérifier.

Comment utiliser la fonction is_nan()

On passe une valeur (généralement le résultat d'un calcul) à is_nan() et on se branche sur le booléen qu'elle renvoie :

php— editable, runs on the server

Ici, acos(1.5) est indéfini, il renvoie donc NaN, is_nan() renvoie true, et le script affiche The number is not a number.

Valider le résultat d'un calcul

Une utilisation typique en situation réelle consiste à protéger la sortie : effectuer un calcul, puis refuser d'afficher ou de stocker le résultat s'il ressort NaN.

<?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() et les vérifications associées

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

Utilisez is_finite() pour confirmer qu'un nombre est une valeur ordinaire et utilisable, is_infinite() pour détecter un dépassement vers l'infini, et is_nan() spécifiquement pour le cas du « résultat indéfini ». Pour valider des chaînes fournies par l'utilisateur avant qu'elles n'atteignent un calcul, préférez is_numeric().

Conclusion

is_nan() est le moyen fiable de détecter la valeur NaN de la norme IEEE 754, que les opérateurs d'égalité ne peuvent jamais capturer car NaN n'est pas égal à lui-même. Utilisez-la pour valider la sortie de fonctions mathématiques comme acos(), sqrt() et log() avant de faire confiance au résultat, et associez-la à is_finite() et is_float() lorsque vous avez besoin d'une vue complète de l'état d'un float.

Pratique

Pratique
Que fait la fonction is_nan() en PHP ?
Que fait la fonction is_nan() en PHP ?
Was this page helpful?