早就想知道浮點數的儲存原理; 從 single 開始理解.
single(單精度浮點數 - 32 位): s
ef18
23 如浮點數: 13.625 (1*10
1 + 3*10
0 + 6*10
-1 + 2*10
-2 + 5*10
-3)其二進位制表示是: 1101.101(1*2
3 + 1*2
2 + 0*2
1 + 1*2
0 + 1*2
-1 + 0*2
-2 + 1*2
-3)係數(或叫尾數)規範化: 1101.101 = 1.101101 * 2
3係數規範化以後, 都可成為 1.***xx... 的樣子, 所以為節省空間, "點" 前面的 1 就無須儲存了.
這樣可以知道此數的指數(e)是 00000011(十進位制的 3)、尾數(f) 是 101101(省去了前面的 1. 回算時必須加上)
符號位(s)只佔乙個二進位制位, 非常簡單: 0 是正, 1 是負.
指數(e)在這裡還有乙個規則: 實際儲存 = e+127; 這是為了協調指數的正負.
重新落實最後的結果:
s: 應該是 0, 這裡是個正數;
e: 應該是: 10000010, 這對應 10 進製的 130(3+127);
f: 10110100000000000000000, 尾數佔 23 位.
結果應該是: 01000001010110100000000000000000
測試下:
function tobin(p: pbytearray; b: integer): string;
var i,j: integer;
begin
result := stringofchar('0', b * 8);
for i := 0 to b - 1 do for j := 0 to 7 do
if odd(p^[b-1-i] shr j) then result[i*8 + 8 - j] := '1';
end;
procedure tform1.button1click(sender: tobject);
var f1,f2: single;
s1,s2: string;
begin
f1 := 13.625;
f2 := -13.625;
s1 := tobin(@f1, sizeof(f1));
s2 := tobin(@f2, sizeof(f2));
memo1.lines.add(s1); //01000001010110100000000000000000
memo1.lines.add(s2); //11000001010110100000000000000000
end;
procedure tform1.button2click(sender: tobject);
var f1,f2: single;
begin
asmmov f1, 01000001010110100000000000000000b
mov f2, 11000001010110100000000000000000b
end;
showmessagefmt('%g, %g', [f1,f2]); -13.625
end;
其他浮點數的儲存規則:
double 或 real(雙精度浮點數 - 64 位): s
ef111
52 extended(擴充套件精度浮點數 - 80 位): s
eif1
15163
real48(已經淘汰的 48 位浮點數): s
fe139
8
理解浮點數儲存
b 整體呈現 b size medium 二進位制浮點數是以符號數值表示法格式儲存,將最高效位元指定為符號位元 sign bit 指數部份 即次高效的e位元,為浮點數中經指數偏差 exponent bias 處理過後的指數 小數部份 即剩下的f位元,為有效位數 significand 減掉有效位數本...
浮點數儲存理解誤區
計算機中浮點數的儲存分為三部分,符號位 指數 有效值。我們用1.f表示浮點數有效值。單精度的有效數值有23位,但計算機預設整數部分都為1,所以實際上有效值有24位。2 24 10 7,因此在十進位制中的有效位是7位。指數部分有8位二進位制,256個數 0 255 因為指數有符號,同時0和255有其它...
浮點數 儲存
關鍵字 體系結構 ieee754 浮點數 儲存 main 如果不執行上面的 讓我們來直接判斷,輸出的結果會是什麼?而在你執行程式之後,結果卻很讓人詫異 123.456001。為什麼會是123.456001?有六位小數可以理解,最後那個1是為何?有很多人解釋說最後那個1是亂碼,隨機的。嘿嘿 其實無論你...