はじめに
PHPで浮動小数点を扱う際、しばしば目にする「NaN(非数)」と「INF(無限大)」。
一見すると似ていますが、挙動や比較方法が異なり、試験でもよく問われるポイントです。
この記事では、NaNとINFの違いを具体的なコード例とともに整理します。
目次
NaN(Not a Number)とは
- 例:
sqrt(-1)、acos(2) - 出力例:
float(NAN) - 特徴:
- 自分自身とも一致しない (
NaN === NaNはfalse) - 判定には
is_nan()を使用する必要がある
- 自分自身とも一致しない (
NaNになる代表的なパターン
| 関数 | 入力例 | 理由 | 結果 |
|---|---|---|---|
sqrt(-1) | -1 | 負の数の平方根は実数で定義できない | float(NAN) |
log(-1) | -1 | 負の数の対数は実数で定義できない | float(NAN) |
acos(2) | 2 | acos(x) の定義域は -1 ≤ x ≤ 1 | float(NAN) |
asin(2) | 2 | asin(x) の定義域は -1 ≤ x ≤ 1 | float(NAN) |
atanh(2) | 2 | atanh(x) の定義域は -1 < x < 1 | float(NAN) |
INF(無限大)とは
- 例:
1/0→INF、log(0)→-INF - 出力例:
float(INF),float(-INF) - 特徴:
- 数値として扱えるため、
===で比較可能 (INF === INFはtrue) - 判定には
is_infinite()を利用できる
- 数値として扱えるため、
INFが発生する代表例
| 関数 | 入力例 | 理由 | 結果 |
|---|---|---|---|
1/0 | 0 | ゼロ除算 | float(INF) |
log(0) | 0 | 0の対数は -∞ | float(-INF) |
exp(1000) | 大きすぎる値 | オーバーフロー | float(INF) |
実行例
$nan = sqrt(-1);
var_dump($nan); // float(NAN) → 負の数の平方根は実数で定義できない
var_dump(is_nan($nan)); // bool(true)
var_dump($nan === NAN); // bool(false)
$inf = log(0);
var_dump($inf); // float(-INF)
var_dump(is_infinite($inf));// bool(true)
var_dump($inf === -INF); // bool(true)NaNとINFの比較表
| 種類 | 発生例 | 出力例 | 判定方法 | === 比較 |
|---|---|---|---|---|
| NaN (Not a Number) | sqrt(-1)acos(2) | float(NAN) | is_nan($val) | false(NaN === NaN も false) |
| INF (正の無限大) | 1/0log(PHP_INT_MAX) | float(INF) | is_infinite($val) | true(INF === INF は true) |
| -INF (負の無限大) | log(0) | float(-INF) | is_infinite($val) | true(-INF === -INF は true) |
まとめ
- NaNは比較できない(is_nan()で判定)
- INFは比較できる(is_infinite()または===)
- 試験では「NaNだけ特殊」という点を押さえておけば得点源になる
