《PHP8上級試験対策》PHPでのNaNとINFの違いを理解する【is_nan / is_infinite】

  • URLをコピーしました!

はじめに

PHPで浮動小数点を扱う際、しばしば目にする「NaN(非数)」と「INF(無限大)」。
一見すると似ていますが、挙動や比較方法が異なり、試験でもよく問われるポイントです。
この記事では、NaNとINFの違いを具体的なコード例とともに整理します。

キーワード: NaN / INF / is_nan() / is_infinite()

目次

NaN(Not a Number)とは

  • 例:sqrt(-1)acos(2)
  • 出力例:float(NAN)
  • 特徴:
    • 自分自身とも一致しない (NaN === NaNfalse)
    • 判定には is_nan() を使用する必要がある

NaNになる代表的なパターン

関数入力例理由結果
sqrt(-1)-1負の数の平方根は実数で定義できないfloat(NAN)
log(-1)-1負の数の対数は実数で定義できないfloat(NAN)
acos(2)2acos(x) の定義域は -1 ≤ x ≤ 1float(NAN)
asin(2)2asin(x) の定義域は -1 ≤ x ≤ 1float(NAN)
atanh(2)2atanh(x) の定義域は -1 < x < 1float(NAN)

INF(無限大)とは

  • 例:1/0INFlog(0)-INF
  • 出力例:float(INF), float(-INF)
  • 特徴:
    • 数値として扱えるため、=== で比較可能 (INF === INFtrue)
    • 判定には is_infinite() を利用できる

INFが発生する代表例

関数入力例理由結果
1/00ゼロ除算float(INF)
log(0)00の対数は -∞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)falseNaN === NaNfalse
INF (正の無限大)1/0log(PHP_INT_MAX)float(INF)is_infinite($val)trueINF === INFtrue
-INF (負の無限大)log(0)float(-INF)is_infinite($val)true-INF === -INFtrue

まとめ

  • NaNは比較できない(is_nan()で判定)
  • INFは比較できる(is_infinite()または===)
  • 試験では「NaNだけ特殊」という点を押さえておけば得点源になる

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次