is_finite()
La funzione is_finite() in PHP determina se un valore è un numero finito, escludendo INF, -INF e NAN.
La funzione is_finite() in PHP indica se un numero è finito — ovvero un numero normale che non è né infinito (INF / -INF) né NAN (Not a Number). Questa pagina spiega cosa si intende per finito, come la funzione gestisce i valori non numerici e quando utilizzarla nel codice reale.
Sintassi
is_finite(float $num): bool$num— il valore da verificare. Viene trattato comefloat; le stringhe numeriche e gli interi vengono convertiti automaticamente.- Valore restituito —
truese$numè un numero finito,falsese èINF,-INFoNAN.
Perché il concetto di "finito" è importante
L'aritmetica in virgola mobile può produrre valori speciali che non sono numeri ordinari:
INFe-INFcompaiono quando un risultato supera l'intervallo di unfloat(ad esempio dividendo per zero con i float, o conPHP_FLOAT_MAX * 2).NANcompare per operazioni non definite comesqrt(-1)oINF - INF.
Questi valori si propagano silenziosamente nei calcoli successivi e compromettono i confronti (NAN == NAN restituisce persino false). is_finite() consente di rilevarli prima che corrompano l'output.
Esempio di base
Questo imposta una variabile su un numero ordinario e stampa The number is a finite number, perché 10 è finito.
Comportamento con valori diversi
L'esempio seguente mostra cosa restituisce is_finite() per i casi limite più comuni:
<?php
var_dump(is_finite(10)); // bool(true) — a normal integer
var_dump(is_finite(3.14)); // bool(true) — a normal float
var_dump(is_finite("42")); // bool(true) — numeric string is cast to float
var_dump(is_finite(PHP_FLOAT_MAX)); // bool(true) — large but still finite
var_dump(is_finite(INF)); // bool(false) — positive infinity
var_dump(is_finite(-INF)); // bool(false) — negative infinity
var_dump(is_finite(PHP_FLOAT_MAX * 2));// bool(false) — overflows to INF
var_dump(is_finite(NAN)); // bool(false) — Not a Number
?>Si noti che is_finite() non verifica che un valore sia numerico — esegue prima la conversione. is_finite("hello") diventa is_finite(0.0) e restituisce true. Se è necessario confermare che un valore è effettivamente un numero, validarlo prima con is_numeric().
Un caso d'uso pratico
Un pattern comune consiste nel proteggere un calcolo che potrebbe andare in overflow verso INF:
<?php
function safeSquare($x) {
$result = $x * $x;
// If the multiplication overflows, $result becomes INF.
return is_finite($result) ? $result : null;
}
var_dump(safeSquare(3.0)); // float(9)
var_dump(safeSquare(PHP_FLOAT_MAX)); // NULL — squaring overflows to INF
?>Qui safeSquare() restituisce null invece di permettere a INF di propagarsi nel resto del programma, così il chiamante può gestire il fallimento in modo pulito. (Si noti che in PHP 8+, la divisione intera/float per zero genera un DivisionByZeroError anziché produrre INF, quindi l'overflow è il modo tipico in cui si incontra un risultato infinito.)
Funzioni correlate
is_infinite()— il controllo opposto: restituiscetrueperINF/-INF.is_nan()— verifica specificamente la presenza diNAN.is_numeric()— controlla se un valore è un numero o una stringa numerica prima di eseguire operazioni matematiche.is_float()— controlla se il tipo di una variabile èfloat.
Conclusione
is_finite() è una piccola ma importante protezione quando si lavora con la matematica in virgola mobile in PHP. Restituisce true solo per i numeri ordinari e false per INF, -INF e NAN, consentendo di intercettare overflow e risultati non definiti prima che si propaghino. Abbinala a is_numeric() per la validazione dell'input e a is_infinite() / is_nan() quando è necessario sapere esattamente quale valore speciale è stato ottenuto.