Golang 入門 : 浮點數


浮點數介紹

Go語言提供了兩種精度的浮點數:float32float64。它們的算術規范由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 用於測試一個數是否是非數 NaNmath.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)。
  • 另外要注意,eE 不能出現在浮點數的十六進制文字表示中。
    一些合法的浮點數的十六進制文字表示例子(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..00e00x0p0 等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM