Asayomu Tech
注目★★★★★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 を明示的に検証すべき。

詳細を読む → 元記事へ※ 本文は元記事をご確認ください (asayomu は要約のみ提供)

関連する記事

※ 外部記事の権利は原著作者に帰属します。著作権削除要請は copyright@asayomu.jp までご連絡ください(受領確認 24h・実処理 72h 以内)。