is_infinite()
La funzione is_infinite() in PHP controlla se un valore float è infinito, ovvero uguale a INF o -INF.
La funzione is_infinite() in PHP controlla se un valore in virgola mobile è infinito — cioè uguale a INF (infinito positivo) o -INF (infinito negativo). Questa pagina spiega cosa si intende per "infinito", come si comporta la funzione e le situazioni pratiche in cui è utile utilizzarla.
Sintassi e valore restituito
is_infinite(float $num): bool$num— il valore da verificare.- Restituisce
truese$numèINFo-INF, efalseper qualsiasi altro valore, inclusi i numeri finiti normali eNAN(Not a Number).
is_infinite() ha senso solo per i float. In PHP i numeri interi non possono mai essere infiniti, quindi la funzione restituisce sempre false per essi.
Da dove provengono i valori infiniti?
In PHP, i numeri in virgola mobile seguono lo standard IEEE 754, che prevede valori speciali per l'infinito. Si ottiene INF o -INF quando:
- Si usa direttamente la costante predefinita:
$x = INF; - Un calcolo va in overflow rispetto all'intervallo di un float (approssimativamente
±1.8e308):1.0e308 * 10diventaINF. - Si verifica una divisione per zero in virgola mobile, oppure una funzione come
log(0)restituisce infinito negativo.
Poiché questi valori si propagano silenziosamente nei calcoli successivi (INF + 1 è ancora INF), verificarli è il modo per individuare un calcolo andato fuori intervallo.
Utilizzo di base
Qui assegniamo la costante INF a $number, poi chiamiamo is_infinite() per verificarla. La condizione è vera, quindi lo script stampa The number is infinite.
Cosa è e cosa non è infinito
La tabella dei valori sottostante mostra esattamente cosa restituisce is_infinite(). Si noti che l'overflow produce INF, mentre un numero grande ma rappresentabile non lo fa:
<?php
var_dump(is_infinite(INF)); // bool(true)
var_dump(is_infinite(-INF)); // bool(true)
var_dump(is_infinite(PHP_FLOAT_MAX * 2)); // bool(true) — overflow
var_dump(is_infinite(1 / 0.0001)); // bool(false) — large but finite
var_dump(is_infinite(42)); // bool(false) — an integer
var_dump(is_infinite(NAN)); // bool(false) — NAN is not infinite
?>Il punto critico: NAN (il risultato di operazioni come sqrt(-1)) non è infinito, quindi is_infinite(NAN) è false. Usa is_nan() per rilevare quel caso, e is_finite() per confermare che un valore è un numero ordinario e utilizzabile.
Un esempio pratico: protezione dall'overflow
Un utilizzo comune nel mondo reale è la validazione del risultato di un calcolo prima di salvarlo o visualizzarlo. Se un'operazione è andata in overflow producendo INF, il codice può reagire invece di propagare l'infinito a valle:
<?php
function guardedMultiply(float $a, float $b): string
{
$product = $a * $b;
return is_infinite($product)
? "Result overflowed to infinity"
: "Result: $product";
}
echo guardedMultiply(1.0e200, 1.0e200), PHP_EOL; // Result overflowed to infinity
echo guardedMultiply(2, 3), PHP_EOL; // Result: 6
?>Moltiplicare 1.0e200 per se stesso supera l'intervallo dei float, quindi il prodotto è INF e il controllo lo intercetta. La seconda chiamata restituisce un valore normale.
is_infinite() rispetto alle funzioni correlate
PHP raggruppa diversi helper per l'ispezione dei float. Scegli quello che corrisponde alla domanda che stai ponendo:
is_infinite()— il valore èINFo-INF?is_finite()— il valore è un numero normale e finito (nonINF,-INFoNAN)?is_nan()— il valore èNAN?is_float()— la variabile è di tipo float?
Per altri helper numerici, consulta il riferimento PHP Math.
Conclusione
is_infinite() restituisce true solo per INF e -INF, permettendoti di rilevare l'overflow in virgola mobile e altre operazioni che producono infinito. Abbinala a is_finite() e is_nan() per validare completamente il risultato di qualsiasi calcolo con float prima di utilizzarlo.