Is nan: примеры (PHP)

Проверка на нечисловое значение с is_nan в PHP
Раздел: Работа с переменными
is_nan(float $num): bool

Описание функции is_nan

Функция is_nan() определяет, является ли переданное значение Not a Number (не числом). Она возвращает true, если значение не является числом, и false в противном случае.

Когда используется

Функция применяется для проверки результатов математических операций, которые могут привести к неопределенным или нечисловым значениям. Например, при обработке данных расчетов, статистики или при работе с пользовательским вводом в математических выражениях.

Аргументы функции

Функция принимает один обязательный аргумент:

  • $value — проверяемое значение. Может быть целым числом, числом с плавающей точкой или строкой, содержащей число.

Примеры использования is_nan

Проверка положительного результата
<?php
$result = acos(2); // арккосинус от числа > 1
var_dump(is_nan($result));
?>
bool(true)
Проверка обычного числа
<?php
$value = 25.5;
var_dump(is_nan($value));
?>
bool(false)
Проверка строкового представления числа
<?php
$value = '12.34';
var_dump(is_nan($value));
?>
bool(false)
Проверка бесконечности
<?php
$value = log(0);
var_dump(is_nan($value));
?>
bool(false) // Это бесконечность, а не NaN

Похожие функции в PHP

  • is_finite() — проверяет, является ли значение конечным числом.
  • is_infinite() — определяет, является ли значение бесконечностью.
  • is_numeric() — проверяет, является ли значение числом или строкой, содержащей число.
  • filter_var() с фильтром FILTER_VALIDATE_FLOAT — валидация чисел с плавающей точкой.
Когда что использовать

Функция is_nan() применяется только для проверки специального значения NaN. Для общей проверки на число используют is_numeric(). Для проверки на бесконечность — is_infinite().

Типичные ошибки при использовании

Путаница с is_numeric
<?php
$value = '123abc';
var_dump(is_nan($value)); // Ожидается true, но
?>
bool(false) // Так как is_nan не проверяет строки на содержание нечисловых символов
Неправильная проверка бесконечности
<?php
$value = INF;
if (is_nan($value)) {
    echo 'Это NaN';
} else {
    echo 'Это бесконечность';
}
?>
Это бесконечность
Сравнение через ==
<?php
$nan = acos(2);
if ($nan == NAN) {
    echo 'Равно';
} else {
    echo 'Не равно';
}
?>
Не равно // NaN не равен даже самому себе

Изменения в последних версиях PHP

В PHP 8.0 были изменения в строгости типов. Функция is_nan() теперь принимает только значения типа int, float или string, содержащую число. Передача нескалярных значений вызывает ошибку TypeError.

<?php
// PHP 7
var_dump(is_nan([1, 2]));
?>
bool(false) // Предупреждение, но возвращалось false
<?php
// PHP 8
var_dump(is_nan([1, 2]));
?>
TypeError: is_nan(): Argument #1 ($value) must be of type int|float, array given

Расширенные примеры использования

Обработка пользовательского ввода
Пример php
<?php
function safeDivision($a, $b) {
    if ($b == 0) {
        return NAN;
    }
    return $a / $b;
}
$result = safeDivision(10, 0);
if (is_nan($result)) {
    echo 'Деление на ноль';
} else {
    echo 'Результат: ' . $result;
}
?>
Деление на ноль
Фильтрация массива
Пример php
<?php
$data = [2.5, acos(2), log(0), 10, NAN];
$filtered = array_filter($data, fn($value) => !is_nan($value));
print_r($filtered);
?>
Array
(
    [0] => 2.5
    [2] => -INF
    [3] => 10
)
Сравнение с другими типами
Пример php
<?php
$values = [NAN, INF, -INF, 0.0, 'текст'];
foreach ($values as $value) {
    echo 'Значение: ' . var_export($value, true) . ' - is_nan: ' . (is_nan($value) ? 'true' : 'false') . '\n';
}
?>
Значение: NAN - is_nan: true
Значение: INF - is_nan: false
Значение: -INF - is_nan: false
Значение: 0.0 - is_nan: false
Значение: 'текст' - is_nan: false
Использование в научных расчетах
Пример php
<?php
function calculateStandardDeviation($values) {
    $mean = array_sum($values) / count($values);
    $sum = 0;
    foreach ($values as $value) {
        $sum += pow($value - $mean, 2);
    }
    $variance = $sum / count($values);
    $stdDev = sqrt($variance);
    return is_nan($stdDev) ? 0 : $stdDev;
}
$data = [1, 2, 3];
echo calculateStandardDeviation($data);
?>
0.81649658092773

Аналоги функции в других языках

Is nan в Python

Используется функция math.isnan() из модуля math.

import math
print(math.isnan(float('nan')))
True

Is nan в Javascript

Используется глобальная функция isNaN() или метод Number.isNaN().

console.log(isNaN(NaN)); // true
console.log(Number.isNaN('текст')); // false
true
false

Is nan в MySQL

Проверка осуществляется через сравнение с константой NULL или использование функции ISNULL().

SELECT 0/0 IS NULL; -- MySQL возвращает NULL для деления на ноль
1
Основные отличия

В JavaScript isNaN() пытается преобразовать значение в число, а Number.isNaN() — нет. В Python проверяется только значение типа float.

PHP is_nan function comments

En
Is nan Finds whether a value is not a number