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): boolAccetta 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-1e1.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
NANstessa.
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 / 0direttamente genera unDivisionByZeroErrorin PHP 8+, quindi non restituisce silenziosamente NaN. Usafdiv(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:
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
| Valore | 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() 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.