W3docs

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): bool

Recibe 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 -1 y 1.
  • 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 NAN en 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 / 0 directamente lanza un DivisionByZeroError en PHP 8+, por lo que no devuelve NaN silenciosamente. Usa fdiv(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:

php— editable, runs on the server

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

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

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.

Práctica

Práctica
¿Qué hace la función is_nan() en PHP?
¿Qué hace la función is_nan() en PHP?
Was this page helpful?