一個東西來來回回的討論,關了又開,關了後建新的,新的被ban 了,又發現新的論據,再打開新的。這在職場工作中很常見,在 Go 的提案討論中,也出現了...
今天要分享的是 Go map 在 NaN 上的一個爭議和可能即將出現的 API 增加。
背景與考題
NaN 是什麼
在電腦科學中,有一個神奇的值,叫做:NaN(Not a Number,非數)。它是數值資料類型的一類值,表示未定義或不可表示的值。常在浮點數運算中使用。首次引進 NaN 的是 1985 年的 IEEE 754 浮點數標準。
在 NaN 值的儲存和比較時,會有問題。因為判斷一個值是否為 NaN 時,不能以判斷 x=NaN 或 x≠NaN 來比較。但因為 NaN 永遠不等於其自身,因此可判斷 x=x 或 x≠x 來判斷 x 是否為 NaN 值,將會分別回傳 False 和 True。
當 NaN 與另一個浮點數 x(其中 x 可為正常值、正負無窮大或 NaN)進行比較時,比較結果如下:
##比較
結果
#NaN ≥ x
False
NaN ≤ x
False
#NaN > x
False
#NaN False
NaN = x
False
NaN ≠ x# ## ###真的###########
這裡的理解對於下面的考題很重要。
Go IEEE-754 考題
在Go101 上看到一道關於IEEE-754 浮點數的題,我在這裡引用題目,以下程式碼輸出什麼?
如下程式碼:
package main
import "math"
func main() {
a, b, c := 2.0, 1.0, 0.0
x, y := a/c, b/c // infinity
n := math.NaN() // not a number
m := math.Sqrt(-1.0) // not a number
println(x == y, m == n)
}
登入後複製
A:true true。
B:true false。
C:false false。
D:false true。
答案是啥?是 A 嗎,還是 D?
對上述程式進行解析,變數 x,y 是 Inf 正無窮。 m,n 是 NaN 無窮值。
正確的答案是:B。
你答對了嗎?
提案
在對 NaN 有了基本的了解後,我們可以正式進入主題了。在Go map 關聯提案中,常提到新增API,用於滿足清空map 的訴求: