1 回答

TA貢獻1829條經驗 獲得超7個贊
a被分配了4000.0表示為 a 的次佳值float64,它0x40AF400000000000正好對應于4000.0。
b是 的次佳值1e-9,表示為 a float64,它是0x3E112E0BE826D695并且對應于1.00000000000000006228159145778E-9。你在這里失去了精度。
因此,在計算之前,c您已經有輕微的不精確性。然后當c實際計算時,你會失去一些更精確的四舍五入。
在 的情況下d,只有一個“次優”在進行;當將編譯時計算的全精度值表示4000.0 / 1e-9為 a 時float64。
關于變量的旁白:在 C(大概是 C++)中,默認是假設變量是非易失性的,即不共享,因此優化通常深入遵循常量表達式,用計算值替換所有內容。Go 不對變量的范圍做任何假設,因此不保證替換常量表達式。這在未來可能會發生變化,但今天,該部門沒有做太多工作,因此很可能c實際上是在運行時計算的,而不是像習慣 C 的人可能認為的那樣在編譯時計算。
編輯:我采用了@topskip 提供的程序:
package main
import "fmt"
func main() {
a := 4000.0
b := 1e-9
c := a / b
d := 4000.0 / 1e-9
fmt.Println(a)
fmt.Println(b)
fmt.Println(c)
fmt.Println(d)
}
這是由go tool 6g -S以下生成的程序集的一部分:
0x0021 00033 (meh.go:6) MOVSD $f64.40af400000000000+0(SB),X2
0x002a 00042 (meh.go:7) MOVSD $f64.3e112e0be826d695+0(SB),X3
0x0033 00051 (meh.go:8) MOVAPD X2,X0
0x0037 00055 (meh.go:8) MOVSD X3,"".b+64(SP)
0x003d 00061 (meh.go:8) DIVSD X3,X0
如你所見;c是在運行時根據我描述的兩個常量計算的。
- 1 回答
- 0 關注
- 187 瀏覽
添加回答
舉報