float32和float64


float32 和 float64#

Go語言中提供了兩種精度的浮點數 float32 和 float64。

float32,也即我們常說的單精度,存儲占用4個字節,也即4*8=32位,其中1位用來符號,8位用來指數,剩下的23位表示尾數

float64,也即我們熟悉的雙精度,存儲占用8個字節,也即8*8=64位,其中1位用來符號,11位用來指數,剩下的52位表示尾數

那么精度是什么意思?有效位有多少位?

 

 

精度主要取決於尾數部分的位數。

對於 float32(單精度)來說,表示尾數的為23位,除去全部為0的情況以外,最小為2-23,約等於1.19*10-7,所以float小數部分只能精確到后面6位,加上小數點前的一位,即有效數字為7位。

同理 float64(單精度)的尾數部分為 52位,最小為2-52,約為2.22*10-16,所以精確到小數點后15位,加上小數點前的一位,有效位數為16位。

 

 

通過以上,可以總結出以下幾點:

一、float32 和 float64 可以表示的數值很多

浮點數類型的取值范圍可以從很微小到很巨大。浮點數取值范圍的極限值可以在 math 包中找到:

  • 常量 math.MaxFloat32 表示 float32 能取到的最大數值,大約是 3.4e38;
  • 常量 math.MaxFloat64 表示 float64 能取到的最大數值,大約是 1.8e308;
  • float32 和 float64 能表示的最小值分別為 1.4e-45 和 4.9e-324。

二、數值很大但精度有限

人家雖然能表示的數值很大,但精度位卻沒有那么大。

  • float32的精度只能提供大約6個十進制數(表示后科學計數法后,小數點后6位)的精度
  • float64的精度能提供大約15個十進制數(表示后科學計數法后,小數點后15位)的精度

這里的精度是什么意思呢?

比如 10000018這個數,用 float32 的類型來表示的話,由於其有效位是7位,將10000018 表示成科學計數法,就是 1.0000018 * 10^7,能精確到小數點后面6位。

此時用科學計數法表示后,小數點后有7位,剛剛滿足我們的精度要求,意思是什么呢?此時你對這個數進行+1或者-1等數學運算,都能保證計算結果是精確的

import "fmt"

var myfloat float32 = 10000018
func main() {
  fmt.Println("myfloat: ", myfloat)
  fmt.Println("myfloat: ", myfloat+1)
}
/*
myfloat: 1.0000018e+07
myfloat: 1.0000019e+07
/

  

上面舉了一個剛好滿足精度要求數據的臨界情況,為了做對比,下面也舉一個剛好不滿足精度要求的例子。只要給這個數值多加一位數就行了。

換成 100000187,同樣使用 float32類型,表示成科學計數法,由於精度有限,表示的時候小數點后面7位是准確的,但若是對其進行數學運算,由於第八位無法表示,所以運算后第七位的值,就會變得不精確。

這里我們寫個代碼來驗證一下,按照我們的理解下面 myfloat01 = 100000182 ,對其+5 操作后,應該等於 myfloat02 = 100000187,

import "fmt"

var myfloat01 float32 = 100000182
var myfloat02 float32 = 100000187
func main() {
    fmt.Println("myfloat: ", myfloat01)
    fmt.Println("myfloat: ", myfloat01+5)
    fmt.Println(myfloat02 == myfloat01+5)
}

  

但是由於其類型是 float32,精度不足,導致最后比較的結果是不相等(從小數點后第七位開始不精確)

myfloat: 1.00000184e+08
myfloat: 1.0000019e+08
false

由於精度的問題,就會出現這種很怪異的現象,myfloat == myfloat +1 會返回 true 。

轉載 :https://www.cnblogs.com/HappyTeemo/p/15405577.html


免責聲明!

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



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