W3docs

is_nan()

Scopri la funzione is_nan() in PHP: cos'è NaN, perché non puoi usare == e come rilevarlo correttamente.

La funzione is_nan() in PHP indica se un valore in virgola mobile è NaN ("Not a Number") — il valore speciale che lo standard IEEE 754 utilizza per i risultati matematicamente indefiniti. Questa pagina spiega cos'è NaN, perché non è possibile testarlo con ==, come is_nan() risolve il problema e le insidie da tenere d'occhio.

Sintassi

is_nan(float $num): bool

Accetta un singolo argomento in virgola mobile e restituisce true se quel valore è NaN, e false per qualsiasi numero ordinario (inclusi 0.0 e l'infinito).

Cos'è NaN?

NaN è un segnaposto prodotto dalla matematica in virgola mobile quando un'operazione non ha una risposta reale e rappresentabile. Le fonti comuni includono:

  • acos(1.5) — l'arcocoseno è definito solo per input compresi tra -1 e 1.
  • sqrt(-1) — non esiste una radice quadrata reale di un numero negativo.
  • log(-1) — il logaritmo naturale non è definito per numeri non positivi.
  • fdiv(0, 0) — divisione di zero per zero in stile virgola mobile.
  • La costante predefinita NAN stessa.

NaN ha tipo double (il tipo float di PHP), quindi si intrufola nel codice che controlla solo is_float(). È esattamente per questo che esiste un test dedicato.

Nota: scrivere 0 / 0 direttamente genera un DivisionByZeroError in PHP 8+, quindi non restituisce silenziosamente NaN. Usa fdiv(0, 0) quando vuoi il risultato NaN in virgola mobile invece di un'eccezione.

Perché non puoi confrontare NaN con ==

La proprietà più importante di NaN è che non è uguale a nulla, nemmeno a se stesso. Qualsiasi confronto che coinvolge NaN restituisce 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)
?>

Poiché $x == NAN è sempre falso, non puoi rilevare NaN tramite confronto. is_nan() è il modo corretto — e l'unico affidabile — per verificarlo.

Come usare la funzione is_nan()

Passi un valore (di solito il risultato di un calcolo) a is_nan() e ramifichi sul boolean che restituisce:

php— editable, runs on the server

Qui acos(1.5) è indefinito, quindi restituisce NaN, is_nan() restituisce true e lo script stampa The number is not a number.

Validare il risultato di un calcolo

Un uso tipico nel mondo reale è la protezione dell'output: esegui un calcolo, poi rifiuta di visualizzare o memorizzare il risultato se è uscito come 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() vs controlli correlati

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

Usa is_finite() per confermare che un numero è un valore ordinario e utilizzabile, is_infinite() per rilevare l'overflow verso l'infinito, e is_nan() specificamente per il caso del "risultato indefinito". Per validare stringhe fornite dall'utente prima che raggiungano un calcolo, usa invece is_numeric().

Conclusione

is_nan() è il modo affidabile per rilevare il valore NaN IEEE 754, che gli operatori di uguaglianza non possono mai intercettare perché NaN non è uguale a se stesso. Usalo per validare l'output di funzioni matematiche come acos(), sqrt() e log() prima di fidarti del risultato, e abbinalo a is_finite() e is_float() quando hai bisogno di un quadro completo dello stato di un float.

Pratica

Pratica
Cosa fa la funzione is_nan() in PHP?
Cosa fa la funzione is_nan() in PHP?
Was this page helpful?