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): boolElle 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-1et1.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
NANelle-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 / 0directement lève uneDivisionByZeroErroren PHP 8+, donc cela ne retourne pas silencieusement NaN. Utilisezfdiv(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 :
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
| Valeur | is_nan() | is_finite() | is_infinite() |
|---|---|---|---|
5.0 | false | true | false |
acos(1.5) (NaN) | true | false | false |
INF | false | false | true |
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.