is_nan()
Aprende a usar is_nan() en PHP para detectar valores NaN producidos por operaciones matemáticas no definidas como acos(1.5) o sqrt(-1).
La función is_nan() en PHP indica si un valor de punto flotante es NaN ("Not a Number"), el valor especial que el estándar IEEE 754 usa para resultados matemáticamente indefinidos. Esta página explica qué es NaN, por qué no puedes comprobarlo con ==, cómo is_nan() resuelve ese problema y los errores más comunes a tener en cuenta.
Sintaxis
is_nan(float $num): boolRecibe un único argumento de punto flotante y devuelve true si ese valor es NaN, y false para cualquier número ordinario (incluyendo 0.0 e infinito).
¿Qué es NaN?
NaN es un marcador producido por la aritmética de punto flotante cuando una operación no tiene una respuesta real representable. Las fuentes más comunes incluyen:
acos(1.5)— el arcocoseno solo está definido para entradas entre-1y1.sqrt(-1)— no existe raíz cuadrada real de un número negativo.log(-1)— el logaritmo natural no está definido para números no positivos.fdiv(0, 0)— dividir cero entre cero en estilo punto flotante.- La constante incorporada
NANen sí misma.
NaN tiene tipo double (el tipo float de PHP), por lo que se cuela en código que solo comprueba is_float(). Por eso existe una prueba dedicada.
Nota: escribir
0 / 0directamente lanza unDivisionByZeroErroren PHP 8+, por lo que no devuelve NaN silenciosamente. Usafdiv(0, 0)cuando quieras el resultado NaN de punto flotante en lugar de una excepción.
Por qué no puedes comparar NaN con ==
La propiedad más importante de NaN es que no es igual a nada, ni siquiera a sí mismo. Cualquier comparación que involucre NaN devuelve 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)
?>Dado que $x == NAN siempre es falso, no puedes detectar NaN mediante comparación. is_nan() es la forma correcta — y la única confiable — de comprobarlo.
Cómo usar la función is_nan()
Pasas un valor (generalmente el resultado de algún cálculo) a is_nan() y bifurcas según el booleano que devuelve:
Aquí acos(1.5) no está definido, por lo que devuelve NaN, is_nan() devuelve true y el script imprime The number is not a number.
Validar el resultado de un cálculo
Un uso típico en el mundo real es proteger la salida: ejecutar un cálculo y luego rechazar mostrar o almacenar el resultado si salió como 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() frente a comprobaciones relacionadas
| Valor | is_nan() | is_finite() | is_infinite() |
|---|---|---|---|
5.0 | false | true | false |
acos(1.5) (NaN) | true | false | false |
INF | false | false | true |
Usa is_finite() para confirmar que un número es un valor ordinario y utilizable, is_infinite() para detectar el desbordamiento a infinito, e is_nan() específicamente para el caso de "resultado indefinido". Para validar cadenas suministradas por el usuario antes de que lleguen a un cálculo, usa is_numeric().
Conclusión
is_nan() es la forma confiable de detectar el valor NaN de IEEE 754, que los operadores de igualdad nunca pueden capturar porque NaN no es igual a sí mismo. Úsala para validar la salida de funciones matemáticas como acos(), sqrt() y log() antes de confiar en el resultado, y combínala con is_finite() e is_float() cuando necesites un panorama completo del estado de un float.