为了账号安全,请及时绑定邮箱和手机立即绑定

NaN 是 golang 中的可比类型吗?

NaN 是 golang 中的可比类型吗?

Go
慕工程0101907 2023-02-14 18:23:02
我遇到了一个使用 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。


查看完整回答
反对 回复 2023-02-14
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

简短的回答是这不是编译器错误。

映射需要可比较的类型作为键。Float(不管是 float32 还是 float64)都是可比类型。NaN(以不同的方式,零,可以是正零或负零)的奇怪之处在于,虽然您可以比较两个 NaN,但它们总是比较不相等。所以当是 NaN 时,一些浮点值x不等于它自己x。这会产生惊喜。

问题 20660评论指出,在许多其他语言中也会出现相同类型的问题。

我特别喜欢 Russ Cox 的评论,即这里只有糟糕的答案。


查看完整回答
反对 回复 2023-02-14
  • 2 回答
  • 0 关注
  • 284 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号