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 で定義されているとのこと。
https://github.com/golang/go/blob/8fc7e76411ed6db7a351db1e4be762cdc5350de5/src/math/bits.go#L30-L31
// NaN returns an IEEE 754 “not-a-number” value.
func NaN() float64 { return Float64frombits(uvnan) }
関連
- 追加調査: IEEE 754 の該当箇所を見る