浮點數介紹
Go語言提供了兩種精度的浮點數:float32
和 float64
。它們的算術規范由IEEE754浮點數國際標准定義,該浮點數規范被所有現代的CPU支持。
這些浮點數類型的范圍可以從很微小到很巨大。浮點數的范圍極限值可以在 math
包找到,常量 math.MaxFloat32
表示 float32
能表示的最大數值;對應的 math.MaxFloat64
表示 float64
能表示的最大數值。
單精度 浮點類型 | 取值范圍 | |
---|---|---|
float32 | 負數時 | -3.402823E38 到 -1.401298E-45 |
float32 | 正數時 | 1.401298E-45 到 3.402823E38 |
雙精度 浮點類型 | 取值范圍 |
---|---|
float64 | -1.79E+308 到 +1.79E+308 |
1.79E-308
是 1.79 乘以 10的負308次方。 1.79E+308
是 1.79 乘以 10的308次方。
math
包中除了提供大量常用的數學函數外,還提供了IEEE754浮點數標准中定義的特殊值的創建和測試:正無窮大和負無窮大,分別用於表示太大溢出的數字和除零的結果;還有 NaN
非數,一般用於表示無效的除法操作結果0/0或Sqrt(-1).
var z float64
fmt.Println(z, -z, 1/z, -1/z, z/z) // "0 -0 +Inf -Inf NaN"
函數 math.IsNaN
用於測試一個數是否是非數 NaN
,math.NaN
則返回非數對應的值。雖然可以用 math.NaN
來表示一個非法的結果,但是測試一個結果是否是非數NaN則是充滿風險的,因為NaN和任何數都是不相等的。
在浮點數中,NaN、正無窮大和負無窮大都不是唯一 的,每個都有非常多種的 bit
模式表示:
nan := math.NaN()
fmt.Println(nan == nan, nan < nan, nan > nan) // "false false false"
如果一個函數返回的浮點數結果可能失敗,最好的做法是用單獨的標志報告失敗,像這樣:
func compute() (value float64, ok bool) {
// ...
if failed {
return 0, false
}
return result, true
}
一個 float32
類型的浮點數可以提供大約 6 個十進制數的精度,而 float64
則可以提供約 15 個十進制數的精度;通常應該優先使用 float64
類型,因為 float32
類型的累計計算誤差很容易擴散,並且 float32
能精確表示的正整數並不是很大。
單精度雙精度兩者區別
在內存中占有的字節數不同
- 單精度浮點數在機內占4個字節。
- 雙精度浮點數在機內占8個字節。
有效數字位數不同
- 單精度浮點數 有效數字7位。
- 雙精度浮點數 有效數字16位。
使用情況區別
- 一般用來表示美元和分的時候用單精度類型。
- 超出人類經驗的數字函數,例如 sin() cos() tan() sqrt() 都使用雙精度值。
浮點數類型值的字面量形式
一個浮點數的完整字面量形式包含一個十進制整數部分、一個小數點、一個十進制小數部分和一個整數指數部分。常常地,某些部分可以根據情況省略掉。
1.23
01.23 // == 1.23
.23
1.
// 一個e或者E隨后的數值是指數值(底數為10)。
// 指數值必須為一個可以帶符號的十進制整數字面量。
1.23e2 // == 123.0
123E2 // == 12300.0
123.E+2 // == 12300.0
1e-1 // == 0.1
.1e0 // == 0.1
0010e-2 // == 0.1
0e+5 // == 0.0
從Go 1.13開始,Go也支持另一種浮點數字面量形式(權稱為十六進制浮點數文字表示)。 在一個十六進制浮點數文字表示中,
- 和整數的十六進制文字表示一樣,浮點數的十六進制文字表示也必須使用
0x
或者0X
開頭。 - 和整數的十六進制文字表示不同的是,字母
p
或者P
可以出現在浮點數的十六進制文字表示中,其后跟隨着一個冪指數(底數為2)。 - 另外要注意,
e
和E
不能出現在浮點數的十六進制文字表示中。
一些合法的浮點數的十六進制文字表示例子(yPn
表示y
乘以2^n
的意思,而yP-n
表示y
除以2^n
的意思):
0x1p-2 // == 0.25
0x2.p10 // == 2048.0
0x1.Fp+0 // == 1.9375
0X.8p-0 // == 0.5
0X1FFFP-16 // == 0.1249847412109375
而下面這幾個均是不合法的浮點數的十六進制文字表示。
0x.p1 // 整數部分表示必須包含至少一個數字
1p-2 // p指數形式只能出現在浮點數的十六進制文字表示中
0x1.5e-2 // e和E不能出現在浮點數的十六進制文字表示中
浮點類型的零值的標准字面量形式為 0.0
。 當然其它很多形式也是合法的,比如0.
、.0
、0e0
和 0x0p0
等。