はじめに
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/0 log(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だけ特殊」という点を押さえておけば得点源になる