主要是小數部分乘以2,取整數部分依次從左往右放在小數點後,直至小數點後爲0正則表達式
浮點數是指用符號,尾數,基數和指數這四部分來表示的小數。由於計算機內部使用的是二進制數,因此基數天然是2。所以,實際的數據中每每不考慮基數,只用符號,尾數,指數這三部分便可表示浮點數。spa
也就是說,64位(雙精度浮點數)和32位(單精度浮點數)的數據,會被分爲三部分來使用。code
符號部分:是指使用一個數據位來表示數值的符號。和用二進制數來表示整數時的符號位時相同的blog
尾數部分:用的是「將小數點前面的值固定爲1的正則表達式」(按照特定的規則來表達數據的形式即爲正則表達式)get
指數部分:用的則是「EXCESS系統表現」io
正則表達式:在二進制中,咱們使用的是「將小數點前面的值固定爲1的正則表達式」。具體來說,就是將二進制數表示的小數左移或右移(這裏是邏輯位移)數次後,整數部分的第1位變爲1,第2位以後都變成0(這樣是爲了消除第2位以上的數位)。並且,第1位的1實際的數據中不保存。因爲第1位必須是1,所以,省略該部分後就節省了一個數據位,從而也就能夠表示更多的數據範圍(雖不算太多)table
單精度浮點數的正則表達式的具體例子以下:class
1011.0011 | 原始數值 |
0001.0110011 | 右移使整數部分的第1位變成1 |
0001.01100110000000000000000變量 |
確保小數點之後的長度爲23 |
01100110000000000000000 | 僅保留小數點後面的部分 |
EXCESS系統表現:經過將指數部分表示範圍的中間值設爲0,使得負數不須要用符號來表示,當指數部分是8位單精度浮點數時,最大值11111111 = 255的1/2,即011111111 = 127(小數部分捨棄)表示的是0,指數部分是11位雙精度浮點數時,1111111111 = 2047的1/2,即011111111111 = 1023(小數部分捨棄)表示的是0。二進制
單精度浮點數指數部分的EXCESS系統表現
實際的值(二進制數) | 實際的值(十進制數) | EXCESS系統表現(十進制數) |
11111111 | 255 | 128 =(255-127) |
11111110 | 254 | 127 =(254-127) |
…… | …… | …… |
01111111 | 127 | 0 =(127-127) |
01111110 | 126 | -1 =(126-127) |
…… | …… | …… |
00000001 | 1 | -126 =(1-127) |
00000000 | 0 | -127 =(0-127) |
在實際的程序中進行確認:
1 #include <stdio.h> 2 3 void main(void){ 4 float data; 5 unsigned long buff; 6 int i; 7 char s[34]; 8 9 //將0.75以單精度浮點數的形式存儲在變量data中 10 data = (float)0.75; 11 12 //把數據複製到4字節長度的整數變量buff中以逐個提取出每一位。 13 memcpy(&buff,&data,4); 14 15 printf("%ld\n",buff); 16 17 18 //逐個提取出每一位 19 for (i = 33; i >= 0; i--){ 20 if(i == 1|| i == 10){ 21 //加入破折號來區分符號部分,指數部分和尾數部分。 22 s[i] = '-'; 23 }else{ 24 //爲各個字節賦值‘0’或者‘1’ 25 if(buff % 2 == 1){ 26 s[i] = '1'; 27 }else{ 28 s[i] = '0'; 29 } 30 buff /= 2; 31 } 32 } 33 s[34] = '\0'; 34 35 //顯示結果 36 printf("%s\n",s); 37 38 getchar(); 39 40 }
輸出結果:
1061158912 0-01111110-10000000000000000000000
該程序執行後,十進制數0.75用單精度浮點數來表示就變成了0-01111110-1000000000000000000000表示的就是(+1.5*2的-1次冪)。