is_infinite()
Разбираем функцию is_infinite() в PHP: как она определяет бесконечные значения и где её применять.
Функция is_infinite() в PHP проверяет, является ли значение с плавающей точкой бесконечным — то есть равным INF (положительная бесконечность) или -INF (отрицательная бесконечность). На этой странице объясняется, что считается «бесконечным», как ведёт себя функция и в каких практических ситуациях она полезна.
Синтаксис и возвращаемое значение
is_infinite(float $num): bool$num— проверяемое значение.- Возвращает
true, если$numравноINFили-INF, иfalseдля любого другого значения, включая обычные конечные числа иNAN(Not a Number).
is_infinite() имеет смысл только для вещественных чисел. Целые числа в PHP никогда не могут быть бесконечными, поэтому для них функция всегда возвращает false.
Откуда берутся бесконечные значения?
В PHP числа с плавающей точкой соответствуют стандарту IEEE 754, который предусматривает специальные значения для бесконечности. Значения INF или -INF появляются когда:
- Используется предопределённая константа напрямую:
$x = INF; - Вычисление выходит за диапазон типа float (примерно
±1.8e308):1.0e308 * 10превращается вINF. - Происходит деление на ноль в вещественной арифметике или функция вроде
log(0)возвращает отрицательную бесконечность.
Поскольку эти значения незаметно распространяются в последующих вычислениях (INF + 1 по-прежнему INF), их проверка позволяет обнаружить расчёт, вышедший за допустимый диапазон.
Базовое использование
Здесь мы присваиваем константу INF переменной $number, а затем вызываем is_infinite() для её проверки. Условие истинно, поэтому скрипт выводит The number is infinite.
Что является и что не является бесконечным
В таблице ниже показано, что именно возвращает is_infinite(). Обратите внимание: переполнение даёт INF, тогда как большое, но представимое число — нет:
<?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
?>Важный момент: NAN (результат таких операций, как sqrt(-1)) не является бесконечным, поэтому is_infinite(NAN) возвращает false. Для обнаружения этого случая используйте is_nan(), а is_finite() — чтобы убедиться, что значение является обычным, пригодным к использованию числом.
Практический пример: защита от переполнения
Распространённый случай применения — проверка результата вычисления перед сохранением или отображением. Если операция привела к INF, код может отреагировать вместо того, чтобы передавать бесконечность дальше:
<?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
?>Умножение 1.0e200 на себя превышает диапазон float, поэтому произведение становится INF и защита срабатывает. Второй вызов возвращает обычное значение.
is_infinite() и связанные функции
PHP предоставляет несколько вспомогательных функций для работы с вещественными числами. Выберите ту, которая соответствует нужной проверке:
is_infinite()— равно ли значениеINFили-INF?is_finite()— является ли значение обычным конечным числом (неINF,-INFи неNAN)?is_nan()— равно ли значениеNAN?is_float()— имеет ли переменная тип float вообще?
Дополнительные числовые функции см. в справочнике по математике PHP.
Заключение
is_infinite() возвращает true только для INF и -INF, позволяя обнаруживать переполнение вещественных чисел и другие операции, дающие бесконечность. Используйте её вместе с is_finite() и is_nan() для полной проверки результата любого вычисления с плавающей точкой перед его использованием.