float儲存格式及FPU

2021-04-26 05:16:09 字數 2763 閱讀 7433

float儲存格式及fpu  

浮點數用科學計數法的形式儲存, 即分成符號位, 底數字和指數字

如 10.0 的二進位制表示為 1010.0, 科學表示法表示為: 1.01exp110, 即 (1+0*1/2+1*1/4)*2^3. 小數點每左移一位指數要加1, 每右移一位指數要減1.

其儲存格式符合ieee標準, 即

資料格式        符號位     底數字     指數字

單精度 float     1        23          8

雙精度 double    1        52         11

擴充套件精度         1        64         15

儲存順序為: 符號位 指數字 底數字, 由於底數的個位必為1, 因此個位和小數點就不儲存. 指數字的高位也是符號位, 不過為1表示正, 0表示負.

float 因有 8 bits, 所以能表示的有 2 的 256 次方,

但因為指數應可正可負,

所以 ieee 規定, 此處算出的次方須減去 127 才是真的指數,

所以 float 的指數可從-126 到 128.

double 型態有 11 bits, 算出的值須減去 1023,

所以double 的指數可從 -1022 到 1024.

底數   (mantissa):      

〈特例〉0   不能以 2 的次方表示

float : 00 00 00 00

double: 00 00 00 00 00 00 00 00

由此可推斷浮點數的精度. 單精度的底數只儲存23位, 即最小一位為 1/2^23, 故精度為 1/2^23 = 1.19209e-7, 可精確到小數點後6位; 雙精度的底數儲存52位, 最小位為 1/2^52, 精度為 1/2^52 = 2.22045e-16, 能精確到小數點後15位.

雙精度的最大值約為 2*2^(2^10-1), 約為1.79e308

關於fpu:

(gdb) list 1,80

1        #include

2        int main(int argc,char **argv)

3       

(gdb) display/i $pc

(gdb) break main

breakpoint 1 at 0x8048365: file float.c, line 4.

(gdb) r

starting program: /home/lsm1982/float

breakpoint 1, main () at float.c:4

4        float val = 1000;

1: x/i $pc   0x8048365 :         mov     $0x447a0000,%eax

(gdb) si

0x0804836a       4        float val = 1000;

1: x/i $pc   0x804836a :         mov     %eax,0xfffffff4(%ebp)

(gdb)

5        int   ival = val;

1: x/i $pc   0x804836d :         flds    0xfffffff4(%ebp)

(gdb)

0x08048370       5        int   ival = val;

1: x/i $pc   0x8048370 :         fnstcw 0xffffffea(%ebp)

(gdb)

0x08048373       5        int   ival = val;

1: x/i $pc   0x8048373 :         movzwl 0xffffffea(%ebp),%eax

(gdb)

0x08048377       5        int   ival = val;

1: x/i $pc   0x8048377 :         mov     $0xc,%ah

(gdb)

0x08048379       5        int   ival = val;

1: x/i $pc   0x8048379 :         mov     %ax,0xffffffe8(%ebp)

(gdb)

0x0804837d       5        int   ival = val;

1: x/i $pc   0x804837d :         fldcw   0xffffffe8(%ebp)

(gdb)

0x08048380       5        int   ival = val;

1: x/i $pc   0x8048380 :         fistpl 0xfffffff8(%ebp)

(gdb)

0x08048383       5        int   ival = val;

1: x/i $pc   0x8048383 :         fldcw   0xffffffea(%ebp)

(gdb)

6        printf("%f/n",val);

1: x/i $pc   0x8048386 :         flds    0xfffffff4(%ebp)

看來強制型別轉換並不只是將儲存的

的二進位制**進行不同型別的解釋,還有其他可能的情況。

fpu也有其在處理器中的特殊性

float儲存方式

c語言 今天在程式中對uint32 t強制轉換float,結果發現是有損轉換,向大佬請教後得知是float儲存的比32bit的值小,所以通過詳細學習float儲存,彌補學習的短板。學習的出處為 感謝 1 s表示符號位,當s 0,v為正數 當s 1,v為負數 2 m表示有效數字,大於等於1,小於2。3...

float 型別的儲存

首先,看一段 int main if d f 這個程式的輸出結果是 hello world 然後你有沒有產生了好奇?這是為啥,下面我就來具體講一講float在記憶體中的儲存方式 目前所有的計算機都支援乙個被稱為ieee浮點的標準.題外話 電器氣和電子工程師協會 ieee 是乙個包括所有電子和計算機技...

float及清除浮動

1.float元素有繼承屬性 inherit.2.span 文件中不顯示,因為span為塊狀元素,不能設定寬和高。3.span 此時在文件中顯示。因為設定了浮動屬性,會讓span元素脫離標準文件流。4.使用浮動,可能出現的問題 若父元素未設定高度,則父元素會塌陷,沒有高度 網頁中的臨近元素出現異位。...