浮點數的儲存及輸出問題

2021-04-02 14:12:07 字數 3158 閱讀 4599

main()

如果不執行上面的**,讓我們來直接判斷,輸出的結果會是什麼?

而在你執行程式之後,結果卻很讓人詫異:

123.456001

。為什麼會是

123.456001

?有六位小數可以理解,最後那個

1是為何?有很多人解釋說最後那個

1是亂碼,隨機的。嘿嘿

~~其實無論你執行它多少次,最後始終都跟著乙個

1。這最後的那個

1不是亂碼,更不是隨機的。

在數學中,表示乙個浮點數需要三要素:尾數(

mantissa

)、指數(

exponent

,又稱為階碼)和基數(

base

)。任意乙個浮點數

n可以表示成下列形式:

n = m × be

,例如n(10) =1.234×10-6

,n(2)= -0.001011×2011

等。 m和e

決定了浮點數的精度(

precision),e

指明小數點在

b進製資料中的位置,因而e和

b決定了浮點數的表示範圍(

range

),浮點數的符號(

sign

)是單獨考慮,表示為:

符號位(s) 階碼

(e)

尾數(m)

為便於軟體的移植,浮點數的表示格式應該有統一標準。

1985

年ieee

(institute of electrical and electronics engineers

)提出了

ieee754

標準。該標準規定基數為

2,階碼

e用移碼表示,尾數

m用原碼表示,根據原碼的規格化方法,最高數字位總是

1,該標準將這個

1預設儲存,使得尾數的表示精度多了一位。實數的

ieee754

標準的浮點數格式為: 型別

儲存位數

總位數

偏移值

(offset) 數符

(s)

階碼(e) 尾數

(m)

短實數(float) 1

8 23

32

127

長實數

(double) 1

11 52

64

1023

說明:

1)

約定小數點左邊隱含有一位

1,實際上使尾數的有效位數為

24位,即尾數為

1.m2)

偏移值= 2 ^ (

尾數字數

- 1) – 1

。必須從指數中減去偏移值,才能確定有符號指數的實際值。

3) 討論

float

型: e = 0, m = 0 ,

若s = 0,

則n = 0;s = 1,

則n = -0。-

0可以表示乙個很小的數,小到在單精度格式中不能

用數字和指數來表示。儘管如此,它們然小於0。

e = 0, m

≠ 0,

則數是有效的,但不是規格化數

, n =

(-1) ^ s × 2 ^ ( - 127) × (0.m)

e = 255, m = 0,

則數為正或負無窮大

, 這取決於

s. e = 255, m

≠ 0, 則n

不是乙個數

,  表示為

nan.

e = 1 ~ 254,

則n = (-1) ^ s × 2 ^ (e - 127) × (1.m),

為規格化數

. 4)

具體可以參見

<

編碼的奧秘

>

一書。

回到前面的問題,語句

float f=123.456f;

經編譯後生成的彙編語句為:

00401028   mov         dword ptr [ebp-4],42f6e979h

十六進製制值

42f6e979h

由何而來?

n (10) = 123.456,

換算成二進位制表示:

n (2) = 1111011. 01110100101111001

= 1. 11101101110100101111001(...) * 2^6 那麼

e – 127 = 6;e = 127 + 6 = 133(10) = 10000101(2)

m = 111 0110 1110 1001 0111 1001 (

省略了最高數字位

1, 共

23bit)

組合起來就是: se

m 0

10000101

111 0110 1110 1001 0111 1001

4bit

一間隔:

0100 0010 1111

0110

1110

1001

0111

1001 42

f 6e9

79 再由

42f6e979h

還原為float型

取出十六進製制數

42f6e979h,

化為二進位制為

0*100 0010 1*111 0110 1110 1001 0111 1001(*

為區分點

)s=0, e=133, m=(1/2+1/4+1/8+1/32+1/64+1/256+1/512+...)=0.92900002002716064453125

n=1*64*(1+0.92900002002716064453125)=123.45600128173828125

哈哈...

大功告成

,與輸出的結果吻合.

如果真要結果的話

,可以這樣

:printf("f=%0.3f/n",f);

以上環境為

window xp professional + sp2,intel p4,vc6.0

其實,上面的內容都是大學所學的東西,《體系結構》課程就講這個。可惜這門課開在大四上學期,我一直忙於找工作,課都沒有好好上,慚愧

~~~

浮點數 儲存

關鍵字 體系結構 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,指數字...

浮點數的儲存

浮點數 float或double 在儲存方式上都遵從ieee的規範,float遵從的是ieee r32.24,資料佔據32bit,double遵從的是r64.53,資料占用64bit。8.25 41 04 00 00 高位在前 0100 0001 0000 0100 0000 0000 0000 0...