Go 中的浮點精確度:float32 與 float64
在 Go 中,浮點數使用 IEEE 754 二進位格式表示。這種格式根據所使用的資料類型提供不同等級的精度,float32 提供的精度低於 float64。
考慮以下程式碼片段,它示範了浮點數圖紙:
package main import "fmt" func main() { a := float64(0.2) a += 0.1 a -= 0.3 var i int for i = 0; a < 1.0; i++ { a += a } fmt.Printf("After %d iterations, a = %e\n", i, a) }
當使用float64,程式正確輸出:
After 54 iterations, a = 1.000000e+00
但是,如果使用float32,程式會進入無限循環。這是因為 float32 無法精確表示十進位值 0.1,導致該值稍微四捨五入。這個舍入值可以防止循環終止。
要了解這種差異,請檢查所涉及的浮點值的二進位表示形式:
float32(0.1): 00111101110011001100110011001101 float32(0.2): 00111110010011001100110011001101 float32(0.3): 00111110100110011001100110011010 float64(0.1): 0011111110111001100110011001100110011001100110011001100110011010 float64(0.2): 0011111111001001100110011001100110011001100110011001100110011010 float64(0.3): 0011111111010011001100110011001100110011001100110011001100110011
請注意,float32 中 0.1 的二進位表示形式與 float64 略有不同。這種細微的差異導致 float32 類型對值的解釋不同,從而導致觀察到的行為。
綜上所述,在使用 float32 時,0.1 的近似值儲存在記憶體中,這會影響精確度和浮點運算的準確性。相較之下,float64 可以更準確地表示小數值 0.1,從而可以進行更精確的計算。
以上是Go 的浮點精度:為什麼 `float32` 會導致無限循環,而 `float64` 不會?的詳細內容。更多資訊請關注PHP中文網其他相關文章!