PHPでは、 IS_NAN関数を使用して、変数が「NAN」(数ではない)であるかどうかを検出します。この機能は、ほとんどの非数値以外の例外を効果的に判断できますが、無限などの特別な数値を扱う際に開発者を混乱させます。
NAN(数ではない) :数字ではない特別な値を示します。通常、計算結果を0/0や負の平方根数などの数値として定義できない場合に発生します。
Infinity :PHPでサポートされている最大浮動値を超えると通常発生する非常に大きな値を示します。たとえば、1/0を計算する場合、 INF (正の無限)または-INF (負の無限)を取得します。
PHPでは、 IS_NAN関数は値がNANであるかどうかのみを決定し、それが無限であるかどうかを決定しません。例えば:
var_dump(is_nan(NAN)); // bool(true)
var_dump(is_nan(INF)); // bool(false)
var_dump(is_nan(-INF)); // bool(false)
ご覧のとおり、 IS_NANは値がNANの場合にのみTRUEを返します。INFや-INFなどの他のfalseは、 INFとNANの両方が例外の数値状態を表しているため、開発者を混乱させる可能性があります。
InfinityとNanの判断を処理するために、他の機能を組み合わせることでこの問題を解決できます。 PHPには、値が無限であるか(正または負の無限)かどうかを判断するために使用できるIS_INFINITE関数がありますが、 IS_NANはそれが「ナン」であるかどうかを判断するために使用されます。
<?php
function is_nan_or_infinite($value) {
if (is_nan($value)) {
return 'NaN';
} elseif (is_infinite($value)) {
return 'Infinity';
} else {
return 'Neither NaN nor Infinity';
}
}
echo is_nan_or_infinite(NAN); // 出力 NaN
echo is_nan_or_infinite(INF); // 出力 Infinity
echo is_nan_or_infinite(-INF); // 出力 Infinity
echo is_nan_or_infinite(123); // 出力 Neither NaN nor Infinity
?>
このカスタム関数IS_NAN_OR_INFINITEは、2つの特別な価値ナンとインフィニティを審査します。最初にiS_NANを使用してから、 iS_infiniteを使用して判断することにより、2つを正確に区別できます。
NANは通常、 0/0やSQRT(-1)などの操作がNANを返す数学的計算エラーである場合に発生します。したがって、データ処理でこれらの外れ値に遭遇した場合は、結果に影響を与えないように、時間内に対処する必要があります。
通常、無限は、 1/0または非常に大きな数値計算などの数学的なオーバーフローがINFまたは-INFを返すときに発生します。アプリケーションでは、Infinityは通常のデータの流れに影響を与える可能性があるため、ビジネスニーズに応じて合理的に処理する必要があります。