KDOC 634: NaNはガードをすり抜ける

この文書のステータス

  • 作成
    • 2026-09-27 貴島
  • レビュー
    • 2026-09-27 貴島

概要

NaNが含まれる可能性のある計算があると、数値比較によるガードをすり抜けることがある。

NaNとの数値比較は != 以外すべて false になり、条件をすり抜けてしまう。

実行して確認する。

import (
  "math"
  "fmt"
)

func main() {
  fmt.Println(math.NaN())
  fmt.Println(math.NaN() > 1)
  fmt.Println(math.NaN() < 1)
  fmt.Println(math.NaN() >= 1)
  fmt.Println(math.NaN() <= 1)
  fmt.Println(math.NaN() == 1)
  fmt.Println(math.NaN() != 1)
}
NaN
false
false
false
false
false
true

定義を見る。この挙動は IEEE 754 で定義されているとのこと。

// NaN returns an IEEE 754 “not-a-number” value.
func NaN() float64 { return Float64frombits(uvnan) }

関連

  • 追加調査: IEEE 754 の該当箇所を見る