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().
Типичные ошибки при использовании
<?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
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
$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
$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
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('текст')); // falsetrue false
Is nan в MySQL
Проверка осуществляется через сравнение с константой NULL или использование функции ISNULL().
SELECT 0/0 IS NULL; -- MySQL возвращает NULL для деления на ноль1
В JavaScript isNaN() пытается преобразовать значение в число, а Number.isNaN() — нет. В Python проверяется только значение типа float.