PHP is_nan() 函数

定义和用法

is_nan() 函数用于判断一个浮点数是否为非数字(NAN,Not A Number)。NAN 通常表示未定义的或不可表示的数学运算结果,例如 acos(2)sqrt(-1)

提示:NAN 与任何值都不相等,包括自身。因此不能使用 ===== 检查 NAN,必须使用 is_nan()。如需判断是否为无穷大,请使用 is_infinite();如需判断是否为有限值,请使用 is_finite()

语法

is_nan(float $num): bool
参数 描述
num 必需。要检查的浮点数。

返回值

如果 num 是 NAN,则返回 true,否则返回 false

PHP 版本

  • PHP 4+
  • PHP 5+
  • PHP 7+
  • PHP 8+

示例

示例 1:基本用法

<?php
$nan = NAN;
$inf = INF;
$finite = 3.14;

var_dump(is_nan($nan));      // bool(true)
var_dump(is_nan($inf));      // bool(false) 无穷大不是NAN
var_dump(is_nan($finite));   // bool(false)

// NAN 不等于自身
var_dump($nan == $nan);      // bool(false)
var_dump($nan === $nan);     // bool(false)
?>

输出:

bool(true)
bool(false)
bool(false)
bool(false)
bool(false)

示例 2:产生 NAN 的运算

<?php
$operations = [
    'acos(2)' => acos(2),
    'asin(2)' => asin(2),
    'sqrt(-1)' => sqrt(-1),
    'log(-1)' => log(-1),
    '0/0' => 0/0,
    'INF - INF' => INF - INF
];

foreach ($operations as $desc => $result) {
    echo "$desc: ";
    if (is_nan($result)) {
        echo "是 NAN";
    } else {
        echo "不是 NAN (值: $result)";
    }
    echo "<br>";
}
?>

输出:

acos(2): 是 NAN
asin(2): 是 NAN
sqrt(-1): 是 NAN
log(-1): 是 NAN
0/0: 是 NAN
INF - INF: 是 NAN

示例 3:实际应用 - 安全处理数学运算

<?php
function safeAcos($x) {
    $result = acos($x);
    if (is_nan($result)) {
        return "无效输入(超出 [-1, 1] 范围)";
    }
    return $result;
}

echo "acos(0.5) = " . safeAcos(0.5) . "<br>";
echo "acos(2) = " . safeAcos(2);
?>

输出:

acos(0.5) = 1.0471975511966
acos(2) = 无效输入(超出 [-1, 1] 范围)

相关函数

注意事项

重要:
  • is_nan() 只对浮点数有意义。如果传入非浮点数,PHP 会先将其转换为浮点数后再判断。
  • NAN 的一个特殊性质是它与任何值(包括自身)都不相等。因此 $x == NAN 永远为 false,必须使用 is_nan($x) 来检查。
  • 该函数在 PHP 8.0+ 中如果传入非数值类型参数会抛出 TypeError,而在之前版本中会发出警告。
  • NAN 通常由无效的数学运算产生,如对负数开平方根或对超出定义域的参数求反三角函数。