is_nan()
Функция is_nan() в PHP проверяет, является ли значение числом NaN (Not a Number). Узнайте о синтаксисе, примерах и особенностях применения.
Функция is_nan() в PHP сообщает, является ли значение с плавающей точкой NaN («Not a Number» — не число) — специальным значением, которое стандарт IEEE 754 использует для результатов, математически неопределённых. На этой странице объясняется, что такое NaN, почему его нельзя проверить с помощью ==, как is_nan() решает эту проблему и какие подводные камни следует учитывать.
Синтаксис
is_nan(float $num): boolФункция принимает один аргумент с плавающей точкой и возвращает true, если это значение равно NaN, и false для любого обычного числа (включая 0.0 и бесконечность).
Что такое NaN?
NaN — это заполнитель, который формируется в арифметике с плавающей точкой, когда операция не имеет реального представимого результата. Распространённые источники:
acos(1.5)— арккосинус определён только для аргументов от-1до1.sqrt(-1)— у отрицательного числа нет вещественного квадратного корня.log(-1)— натуральный логарифм не определён для неположительных чисел.fdiv(0, 0)— деление нуля на ноль в стиле арифметики с плавающей точкой.- Встроенная константа
NANкак таковая.
NaN имеет тип double (тип float в PHP), поэтому он проходит сквозь код, который проверяет только is_float(). Именно поэтому существует специальная функция проверки.
Примечание: запись
0 / 0напрямую вызывает исключениеDivisionByZeroErrorв PHP 8+, поэтому она не возвращает NaN молча. Используйтеfdiv(0, 0), если хотите получить NaN в арифметике с плавающей точкой вместо исключения.
Почему NaN нельзя сравнивать с ==
Важнейшее свойство NaN состоит в том, что он не равен ничему, даже самому себе. Любое сравнение с участием NaN возвращает 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)
?>Поскольку $x == NAN всегда равно false, обнаружить NaN через сравнение невозможно. is_nan() — единственный надёжный способ проверки.
Как использовать функцию is_nan()
Передайте значение (как правило, результат какого-либо вычисления) в is_nan() и ветвитесь по возвращаемому булевому значению:
Здесь acos(1.5) не определён, поэтому возвращает NaN, is_nan() возвращает true, и скрипт выводит The number is not a number.
Проверка результата вычисления
Типичный пример из реальной практики — защита вывода: выполнить вычисление, а затем отказаться отображать или сохранять результат, если он оказался равен 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() и связанные функции
| Значение | is_nan() | is_finite() | is_infinite() |
|---|---|---|---|
5.0 | false | true | false |
acos(1.5) (NaN) | true | false | false |
INF | false | false | true |
Используйте is_finite(), чтобы убедиться, что число обычное и применимое, is_infinite() — для обнаружения переполнения до бесконечности, и is_nan() — специально для случая «неопределённый результат». Для проверки строк, введённых пользователем, до того как они попадут в вычисления, используйте is_numeric().
Заключение
is_nan() — надёжный способ обнаружить значение NaN по стандарту IEEE 754, которое операторы равенства никогда не уловят, поскольку NaN не равен самому себе. Используйте эту функцию для проверки результатов математических функций, таких как acos(), sqrt() и log(), прежде чем доверять результату, и сочетайте её с is_finite() и is_float(), когда нужно получить полное представление о состоянии значения с плавающей точкой.