【问题标题】:Is NaN a comparable type in golang?NaN 是 golang 中的可比类型吗?
【发布时间】:2022-12-20 22:05:41
【问题描述】:

我遇到了一个使用 NaN 作为映射键的 golang 测验,它运行时没有任何错误。如果 map 的键应该是可比较的,那么 NaN 是一个可比较的类型,或者这是一个允许 NaN 作为键的编译器错误。

这是 quiz sourcego playground link 和下面的代码。

package main

var x = 0.0

func 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
}

【问题讨论】:

  • 通常,NaN 是一个特殊的浮点数(如无穷大或负零)。浮点数是可比较的,所以 NaN 是可比较的。

标签: go


【解决方案1】:

任何 float64 都是可比较的。比较任意两个浮点数是没有问题的。您可以将 NaN 与 3.141 或 NaN 与 NaN 进行比较。

问题不是比较能力NaNs/浮点数。问题是任何与 NaN 的比较任何事物,即使是其他 NaN 或它本身也会导致 false。

   NaN != x   for all  x, including NaN

这使得使用 NaN 作为映射键基本上是不可能的,因为不可能找到 NaN。

【讨论】:

    【解决方案2】:

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

    地图需要可比较类型作为钥匙。 Float(不管是 float32 还是 float64)是一个可比类型. NaN(以不同的方式,零,可以是正零或负零)的奇怪之处在于,虽然您可以比较两个 NaN,但它们总是比较不相等。因此,当x 为 NaN 时,某些浮点值 x 不等于其自身。这会产生惊喜。

    Issue 20660 cmets 注意到在许多其他语言中也会出现同样的问题。

    I particularly like Russ Cox's comment that there are only bad answers here.

    【讨论】:

      猜你喜欢
      • 2016-04-21
      • 2017-12-05
      • 2011-04-26
      • 2019-05-28
      • 2017-02-26
      • 2010-10-21
      • 2019-03-26
      相关资源
      最近更新 更多