W3docs

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() и ветвитесь по возвращаемому булевому значению:

php— editable, runs on the server

Здесь 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.0falsetruefalse
acos(1.5) (NaN)truefalsefalse
INFfalsefalsetrue

Используйте is_finite(), чтобы убедиться, что число обычное и применимое, is_infinite() — для обнаружения переполнения до бесконечности, и is_nan() — специально для случая «неопределённый результат». Для проверки строк, введённых пользователем, до того как они попадут в вычисления, используйте is_numeric().

Заключение

is_nan() — надёжный способ обнаружить значение NaN по стандарту IEEE 754, которое операторы равенства никогда не уловят, поскольку NaN не равен самому себе. Используйте эту функцию для проверки результатов математических функций, таких как acos(), sqrt() и log(), прежде чем доверять результату, и сочетайте её с is_finite() и is_float(), когда нужно получить полное представление о состоянии значения с плавающей точкой.

Практика

Практика
Что делает функция is_nan() в PHP?
Что делает функция is_nan() в PHP?
Was this page helpful?