is_finite()
Aprenda sobre a função is_finite() no PHP, usada para verificar se um valor é um número finito, diferente de INF, -INF ou NAN.
A função is_finite() no PHP indica se um número é finito — ou seja, um número normal que não é nem infinito (INF / -INF) nem NAN (Não é um Número). Esta página explica o que é considerado finito, como a função lida com valores não numéricos e quando você a usaria em código real.
Sintaxe
is_finite(float $num): bool$num— o valor a ser testado. É tratado comofloat; strings numéricas e inteiros são convertidos automaticamente.- Valor de retorno —
truese$numfor um número finito,falsese forINF,-INFouNAN.
Por que "finito" importa
A aritmética de ponto flutuante pode produzir valores especiais que não são números comuns:
INFe-INFaparecem quando um resultado ultrapassa o intervalo de umfloat(por exemplo, dividindo por zero com floats ouPHP_FLOAT_MAX * 2).NANaparece para operações indefinidas comosqrt(-1)ouINF - INF.
Esses valores se propagam silenciosamente em cálculos posteriores e quebram comparações (NAN == NAN é até mesmo false). is_finite() permite detectá-los antes que corrompam a saída.
Exemplo básico
Isso define uma variável para um número comum e imprime The number is a finite number, pois 10 é finito.
Como diferentes valores se comportam
O exemplo abaixo mostra o que is_finite() retorna para os casos extremos mais comuns:
<?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
?>Observe que is_finite() não valida se um valor é numérico — ele converte primeiro. is_finite("hello") torna-se is_finite(0.0) e retorna true. Se você precisar confirmar que um valor é realmente um número, valide-o primeiro com is_numeric().
Um caso de uso prático
Um padrão comum é proteger um cálculo que pode transbordar para 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
?>Aqui safeSquare() retorna null em vez de deixar INF vazar para o resto do programa, para que o chamador possa tratar a falha de forma limpa. (Observe que no PHP 8+, a divisão inteira/float por zero lança DivisionByZeroError em vez de produzir INF, portanto o overflow é a forma típica de encontrar um resultado infinito.)
Funções relacionadas
is_infinite()— a verificação oposta: retornatrueparaINF/-INF.is_nan()— testa especificamenteNAN.is_numeric()— verifica se um valor é um número ou string numérica antes de realizar operações matemáticas.is_float()— verifica se o tipo de uma variável éfloat.
Conclusão
is_finite() é uma proteção pequena, mas importante, quando você trabalha com aritmética de ponto flutuante no PHP. Ela retorna true apenas para números comuns e false para INF, -INF e NAN, permitindo capturar overflow e resultados indefinidos antes que se propaguem. Use-a junto com is_numeric() para validação de entrada e com is_infinite() / is_nan() quando precisar saber exatamente qual valor especial foi encontrado.