浮點數的表示

2021-09-25 23:23:39 字數 2442 閱讀 1334

浮點數,是指小數點在資料中的位置可以左右移動的資料。它通常被表示成:

n = m* re

這裡的m(mantissa)被稱為浮點數的尾數,r(radix)被稱為階碼的基數,e(exponent)被稱為階的階碼。計算機中一般規定r為2、8或16、是乙個確定的常數,不需要在浮點數中明確表示出來。因此,要表示浮點數,一是要給出尾數m的值,通常用定點小數形式表示,它決定了浮點數的表示精度,即可以給出的有效數字的位數。二是要給出階碼,通常用整數形式表示,它指出的是小數點在資料中的位置,決定了浮點數的表示範圍。浮點數也要有符號位。在計算機中,浮點數通常被表示成如下格式:mse

m ms是尾數的符號位,即浮點數的符號位,安排在最高一位;

e 是階碼,緊跟在符號位之後,占用m位,含階碼的一位符號;

m 是尾數,在低位部分,占用n位。

在 ieee 標準中,浮點數是將特定長度的連續位元組的所有二進位制位分割為特定寬度的符號域,指數域和尾數域三個域,其中儲存的值分別用於表示給定二進位制浮點數中的符 號,指數和尾數。這樣,通過尾數和可以調節的指數(所以稱為"浮點")就可以表達給定的數值了。具體的格式參見下面的圖例:

在上面的圖例中:

第乙個域為符號域。其中 0 表示數值為正數,而 1 則表示負數。

第二個域為指數域,對應於我們之前介紹的二進位制科學計數法中的指數部分。其中單精度數為 8 位,雙精度數為 11 位。以單精度數為例,8 位的指數為可以表達 0 到 255 之間的 255 個指數值。但是,指數可以為正數,也可以為負數。為了處理負指數的情況,實際的指數值按要求需要加上乙個偏差(bias)值作為儲存在指數域中的值,單精 度數的偏差值為 127,而雙精度數的偏差值為 1023。比如,單精度的實際指數值 0 在指數域中將儲存為 127;而儲存在指數域中的 64 則表示實際的指數值 -63。 偏差的引入使得對於單精度數,實際可以表達的指數值的範圍就變成 -127 到 128 之間(包含兩端)。我們不久還將看到,實際的指數值 -127(儲存為 全 0)以及 +128(儲存為全 1)保留用作特殊值的處理。這樣,實際可以表達的有效指數範圍就在 -127 和 127 之間。

通過上面的格式,我們下面舉例看下-12.5在計算機中儲存的具體資料:

address+0     address+1     address+2     address+3

contents        0xc1                         0x48                           0x00                      0x00     接下來我們驗證下上面的資料表示的到底是不是-12.5,從而也看下它的轉換過程。

由於浮點數不是以直接格式儲存,他有幾部分組成,所以要轉換浮點數,首先要把各部分的值分離出來。

address+0     address+1     address+2     address+3

格式     seeeeeee     emmmmmmm     mmmmmmmm     mmmmmmmm

二進位制     11000001     01001000     00000000     00000000

16進製制     c1                           48                            00                            00

可見:s: 為1,是個負數。

e:為 10000010   轉為10進製為130,130-127=3,即實際指數部分為3.

m:為 10010000000000000000000。 這裡,在底數左邊省略儲存了乙個1,使用 實際底數表示為 1.10010000000000000000000

到此,我們吧三個部分的值都拎出來了,現在,我們通過指數部分e的值來調整底數部分m的值。調整方法為:如果指數e為負數,底數的小數點向左移,如果指數e為正數,底數的小數點向右移。小數點移動的位數由指數e的絕對值決定。

這裡,e為正3,使用向右移3為即得:

1100.10000000000000000000

至次,這個結果就是12.5的二進位制浮點數,將他換算成10進製數就看到12.5了,如何轉換,看下面:

小數點左邊的1100 表示為 (1 × 23) + (1 × 22) + (0 × 21) + (0 × 20), 其結果為 12 。

小數點右邊的 .100… 表示為 (1 × 2-1) + (0 × 2-2) + (0 × 2-3) + ... ,其結果為.5 。

以上二值的和為12.5, 由於s 為1,使用為負數,即-12.5 。

所以,16進製制 0xc1480000 是浮點數 -12.5 。

以下為c/c++ code 檢視計算機記憶體

template

void bits(t const& e)

std::cout

float b=-0.3;

double c=0.5;

bits(a);

bits(b);

bits(c);

return0;

}

浮點數的表示

在定點數表示中存在的乙個問題是,難以表示數值很大的資料和數值很小的資料。例如,電子的質量 9 10 28克 和太陽的質量 2 1033克 相差甚遠,在定點計算機中無法直接表示,因為小數點只能固定在某乙個位置上,從而限制了資料的表示範圍。為了表示更大範圍的資料,數學上通常採用科學計數法,把資料表示成乙...

浮點數的表示

日期 2010年6月 6日 1.前幾天,我在讀一本c語言教材,有一道例題 includevoid main void 執行結果如下 num的值為 9 pfloat的值為 0.000000 num的值為 1091567616 pfloat的值為 9.000000 我很驚訝,num和 pfloat在記憶...

浮點數的表示

浮點數,是指小數點在資料中的位置可以左右移動的資料。它通常被表示成 n m re 這裡的m mantissa 被稱為浮點數的尾數,r radix 被稱為階碼的基數,e exponent 被稱為階的階碼。計算機中一般規定r為2 8或16 是乙個確定的常數,不需要在浮點數中明確表示出來。因此,要表示浮點...