亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么浮動文字和變量在 Go 中給出不同的結果?

為什么浮動文字和變量在 Go 中給出不同的結果?

Go
慕田峪7331174 2021-08-23 15:31:53
在下面的簡單的計算,c并d結束了不同的值(它們是關閉的單個位)。為什么?a := 4000.0b := 1e-9c := a / bd := 4000.0 / 1e-9
查看完整描述

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是在運行時根據我描述的兩個常量計算的。


查看完整回答
反對 回復 2021-08-23
  • 1 回答
  • 0 關注
  • 187 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號