ieee浮點數標準定義了兩種基本的格式:以4個位元組表示單精度格式和8個位元組表示雙精度。
一. 儲存規則
float:
1位符號數 8位指數 23位有效數
0/1 bias:127
double:
1位符號數 11位指數 52位有效數
0/1 bias:1023
1.1 8.25儲存分析
(8.25)10 = (1000.01)2
劃分三部分:
1. 符號位: 0 0正數,1負數
2. 指數字: 10000010 科學記數法表示:(1000.01)2 = 1.00001*2^3,指數為:127+3=130
3. 有效位: 00001 000000000000000000 最高位1去除,不足23位則補0
組合三部分:0 10000010 00001000000000000000000
反向推導01000001000001000000000000000000對應十進位制值:
0 正數
10000010 130-127=3有效位為3
00001000000000000000000 整數部分補1為:1000 小數部分01 即1000.01
1.2 -7.75 儲存分析
1.3 8.58儲存分析
來點複雜的,求8.58單精度浮點數儲存方式:
十進位制小數轉化為二進位制,不斷乘以2,順次取整數字。
0.58*2 = 1.16 1
0.16*2 = 0.32 0
0.32*2 = 0.64 0
0.64*2 = 1.28 1
0.28*2 = 0.56 0
0.56*2 = 1.12 1
0.12*2 = 0.24 0
0.24*2 = 0.48 0
0.48*2 = 0.96 0
0.96*2 = 1.92 1
0.92*2 = 1.84 1
0.84*2 = 1.68 1
0.68*2 = 1.36 1
0.36*2 = 0.72 0
0.72*2 = 1.44 1
0.44*2 = 0.88 0
0.88*2 = 1.76 1
0.76*2 = 1.52 1
0.52*2 = 1.04 1
0.04*2 = 0.08 0
0.08*2 = 0.16 0
0.16*2 = 0.32 0
0.32*2 = 0.64 0
0.64*2 = 1.28 1
0.28*2 = 0.54 0
0.54*2 = 1.08 1
通過上面的計算,我們發現0.58自0.16處一直迴圈,二進位制方式不能完整表示該整數,這會有什麼影響?
8.58 = 1000.10010100011110101110000...
二進位制儲存方式:
0 10000010 00010010100011110101110
測試程式:
float a = 8.58f;
char *p = (char*)&a;
p a$1 = 8.57999992
p /x *p@4
$2 =
gdb除錯發現a的值怎麼變成8.57999992,我們用上述二進位制計算其10進製看看:
0.58 = 10010100011110101110000
>>> 2**-1+2**-4+2**-6+2**-10+2**-11+2**-12+2**-13+2**-15+2**-17+2**-18+2**-19
0.57999992370605469
上述結果與gdb除錯一致,除了可以表示為2的冪次以及整數數乘的浮點數可以準確表示外,其餘的數的值都是近似值。同時float有效位才23位,導致大部分位數被截斷。
二. 大小比較
既然浮點數大多是儲存的近似值,那麼如何比較其大小?
/**
* 浮點數大小比較
*/bool isequal(float a, float b, float abserror, float relerror )
result++;
}// min
if( divisor == int_min )
return result;
///dividend = abs( dividend );
divisor = abs( divisor );
int digit = 0;
// 增大除數的倍數至與除數接近
while( divisor <= (dividend>>1) )
while( digit >= 0 )
return isneg? -result:result;
}
十進位制轉化為二進位制小數
**c/c++的浮點數在記憶體中的儲存方式
C C 中浮點數的儲存
任何資料在記憶體中都是以二進位制的形式儲存的,例如乙個short型資料1156,其二進位制表示形式為00000100 10000100。則在intel cpu架構的系統中,存放方式為 10000100 低位址單元 00000100 高位址單元 因為intel cpu的架構是小端模式。但是對於浮點數在...
浮點數 儲存
關鍵字 體系結構 ieee754 浮點數 儲存 main 如果不執行上面的 讓我們來直接判斷,輸出的結果會是什麼?而在你執行程式之後,結果卻很讓人詫異 123.456001。為什麼會是123.456001?有六位小數可以理解,最後那個1是為何?有很多人解釋說最後那個1是亂碼,隨機的。嘿嘿 其實無論你...
浮點數的儲存
浮點數在計算機中的儲存格式 符號位 指數字 尾數字 符號位 指數字 尾數字 float 1位 8位 23位 共32位 double 1位 11位 52位 共64位 任何浮點數都可表示為 1.m 2e 符號位 sign 表示式中的 0表示正數,1表示負數。指數字 exponent 表示式中的e,指數字...