理解浮點數的儲存規則

2021-09-05 23:38:15 字數 1888 閱讀 1610

早就想知道浮點數的儲存原理; 從 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是亂碼,隨機的。嘿嘿 其實無論你...