當前位置:編程學習大全網 - 源碼下載 - 二進制數怎麽轉化為浮點數?階碼又是怎麽算出來的?

二進制數怎麽轉化為浮點數?階碼又是怎麽算出來的?

C/C++中, 浮點數,float以及 double 在內存中是怎樣存儲的?

假如,我有32-bit

8bit 8bit 8bit 0 0 0 0 0 1 1 1 1

對於整形int,我們可以很快得出,這是 int i = 15的內存形式。

假設,最低位的bit的位權為-1,最高位為30。 那麽這個就不再表示數字15了,而是

2^-1+2^0+2^1+2^2 = 7.5 了。

當然,上面只是假設,那麽真正的Float 浮點型 在內存中是什麽樣子的呢?

首先需要知道的是 float 在內存中 占 32-bit double型 占 64-bit。

浮點型 在內存中,有3部分構成。

Sign bit

Exponent (指數)

Mantissa(尾數,有效數字)

sign bit

是指浮點數在內存中的 最高位,0 表示 正數,1 表示負數。Sing bit 在浮點數float,32-bit內存中,占 1-bit 。

Exponent

指數,比如 10^5,2^6,這兩個數的 5,6既是exponent。當然,數字在內存中都是以2進制體現的,所以這裏的指數,是指以2為底 的指數。比如

0 0 0 0 0 1 1 0

很容易可以知道 Exponent為 6,在表示浮點數的內存中,表示的是 2^6 = 64。

Expoent 在 Float 32-bit的內存中,占8-bit,在這裏把此8-bit視為表示unsigned int 的bit pattern。那麽可以表示的範圍是0~256的整數(指數範圍), 但是指數既可以為正整數,也可以為負整數,這樣以來無法表示-1,-2....這樣的負整數了,所以 IEEE Standard 754 Floating-Point 對此引入了Bias, 偏移量的概念,對於Float型,此偏移量為127. 也就是說 127 這個數字已經被存儲到 Exponent這個部分中了,像之前的那個例子,

0 0 0 0 0 1 1 0

表示的是指數6,但是在float內存結構中,其實表示的是 (6-127)= -121。需要減去已存入的偏移量 127。

假如 2^(1),指數1在float 的內存結構中的 bit pattern是什麽樣子的?

那會不會就是簡單的

0 0 0 0 0 0 0 1

應該是 exponent - 127 = 1;(2^(1)中的指數1是這樣得來的)

exponent = 127+1 = 128.(2^(1)中的指數1,在float內存結構中應該是128的bit pattern才對)

1 0 0 0 0 0 0 0

這只是個例子,幫助理解exponent,不會真的問這樣的問題。。。。

Double型,需要占用64-bit 內存空間。同樣,也是由 Sign bit,Exponent,Mantissa 3部分構成,不過 Exponent部分,在整個64-bit中 要占到 11-bit。此外偏移量 為1023。

Mantissa

Mantissa 尾數部分,在float的32-bit的內存空間中,占到23-bit註意之前說的exponent 指數,最低位是從0開始的,那麽Mantissa,尾數的最高位當然是 -1了。

0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

那麽大家說下,上面的尾數部分在 float 浮點數的內存中,表示多少? 很快可以得到是

2^(-2)+2^(-3) = 0.375。 有錯了,應該是1.375。

大家回想下小學學的 科學記數法,5 = 5.0*10^0 , 0.75 = 7.5*10^(-1)。對吧?

在Float的內存表示中,這23-bit的尾數 僅僅表示 科學記數法 中 非零實數小數點後的精度。 換句話說,Mantissa 包括兩部分,壹個是leading bit(科學記數法的非零實數),另壹個是fraction bits(即精度),此23-bit僅僅表示的是 fraction bits。而在二進制中,非零實數自然是1了,所以leading bit默認是1了。所以上述表格實際上是表示

引用

1 + 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

這也就是為什麽,在float的內存中,尾數部分可以用23-bit pattern 來表示出24-bit的不同數字了。

在Double型的 64-bit 內存結構中,尾數部分要占到52-bit。

我們用個表格來表示 在內存中,float是怎樣存儲的。

+/-Sign Exponent 指數 Fraction bit -> .f

s <---------------- 8 ----------------> <-------------------------------------- 23----------------------------->

Unsigned int 2^(-1), 2^(-2), 2^(-3)............

上面這個表格所要 表示的是如下的浮點數

(-1)^s * 1.f * 2^(Exponent-127)

隨手寫了個32-bit pattern,

0 0 0 0 1 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

2^8 2^0 2^-23

假如告訴妳,這是壹個浮點型的內存結構,那麽這個浮點數是多少呢?

這個浮點數可以很快的得到 (-1)^0*1.(2^-2+2^-3)*2^(2^1+2^2+2^4-127)。

  • 上一篇:跑步軟件記錄路程app哪個好用
  • 下一篇:蘋果7手機怎麽設置視頻桌面?
  • copyright 2024編程學習大全網