注目★★★★★Lobsters
NaN は予想外、プログラミング言語設計に隠れた落とし穴
30秒で把握
- 1Python は NaN == NaN が False だが [NaN] == [NaN] は True に、identity 最適化による仮定の矛盾が顕在化
- 2Lua 数値 for ループは NaN を step に渡すと負数扱いされ、limit < init の比較演算子が動作に直接漏れ出す
- 3両言語とも NaN 対応が不完全・言語仕様への深い理解とエッジケーステストで落とし穴を回避
要約
IEEE-754 の NaN は比較演算が特殊なため、プログラミング言語の設計仮説が破綻することがある。Python では NaN == NaN が False を返すため、リスト比較の最適化 (identity 優先チェック) により [NaN] == [NaN] は True になり、「オブジェクトは自分自身と等しい」という基本仮定が崩れる。Lua では数値 for ループに NaN を渡すと、実装の比較演算子の選択 (limit < init vs idx <= limit) が直接動作に漏れ、ループ実行回数が直感に反する。両言語とも NaN への対応が不完全なため、予期しない振る舞いが発生する。
あなたへの影響
数値計算や物理演算を扱うコード (浮動小数点エラー・ゼロ除算など) で NaN が発生する際。
推奨:Python リストの等値比較や Lua のループ制御が想定外の挙動を示す可能性があるため、エッジケースをテストする際は NaN を明示的に検証すべき。