我遇到了一个使用 NaN 作为映射键的 golang 测验,它运行时没有任何错误。如果 map 的键应该是可比较的,那么 NaN 是一个可比较的类型,或者这是一个允许 NaN 作为键的编译器错误。这是测验来源,go playground 链接和下面的代码。package mainvar x = 0.0func main() { var a = x / x // a = NaN var m = map[float64]int{a: 1} m[a] = 2 for k := range m { delete(m, k) } println(len(m)) // prints 2}
2 回答

长风秋雁
TA贡献1757条经验 获得超7个赞
任何 float64 都是可比较的。比较任意两个浮点数是没有问题的。您可以将 NaN 与 3.141 或 NaN 与 NaN 进行比较。
问题不在于NaN/浮点数的可比性。问题是任何NaN 与anything的比较,甚至是其他 NaN 或它本身都会导致错误。
NaN != x for all x, including NaN
这使得使用 NaN 作为映射键基本上是不可能的,因为不可能找到 NaN。

慕田峪7331174
TA贡献1828条经验 获得超13个赞
简短的回答是这不是编译器错误。
映射需要可比较的类型作为键。Float(不管是 float32 还是 float64)都是可比类型。NaN(以不同的方式,零,可以是正零或负零)的奇怪之处在于,虽然您可以比较两个 NaN,但它们总是比较不相等。所以当是 NaN 时,一些浮点值x
不等于它自己x
。这会产生惊喜。
问题 20660评论指出,在许多其他语言中也会出现相同类型的问题。
我特别喜欢 Russ Cox 的评论,即这里只有糟糕的答案。
- 2 回答
- 0 关注
- 284 浏览
添加回答
举报
0/150
提交
取消