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.使用浮動,可能出現的問題 若父元素未設定高度,則父元素會塌陷,沒有高度 網頁中的臨近元素出現異位。...