C IEEE745浮點數格式

2022-03-31 06:40:55 字數 3082 閱讀 4905

【 在 ilovezks (ilovezks) 的大作中提到: 】 

: 我想求教乙個問題: 

:  c語言中float 是如何表示的?尾數,階碼是如何在32位上安排的,即哪幾位是 

: 尾數,哪幾位是階碼,那一位是符號位。聽說與cpu有關,是真的嗎? 

在c++裡,實數(float)是用四個位元組即三十二位二進位制位來儲存的。其中

有1位符號位,8位指數字和23位有效數字位。實際上有效數字位是24位,因為第

一位有效數字總是「1」,不必儲存。 

有效數字位是乙個二進位制純小數。8位指數字中第一位是符號位,這符號位和

一般的符號位不同,它用「1」代表正,用」0「代表負。整個實數的符號位用「

1」代表負,「0」代表正。 

在這儲存實數的四個位元組中,將最高位址位元組的最高位編號為31,最低位址

位元組的最低位編號為0,則實數各個部分在這32個二進位制位中的分布是這樣的:3

1位是實數符號位,30位是指數符號位,29---23是指數字,22---0位是有效數字

位。注意第一位有效數字是不出現在記憶體中的,它總是「1」。 

將乙個實數轉化為c++實數儲存格式的步驟為: 

(1)先將這個實數的絕對值化為二進位制格式,注意實數的整數部分和小數部

分化為二進位制的方法是不同的。 

(2)將這個二進位制格式實數的小數點左移或右移n位,直到小數點移動到第

乙個有效數字的右邊。 

(3)從小數點右邊第一位開始數出二十三位數字放入第22到第0位。 

(4)如果實數是正的,則在第31位放入「0」,否則放入「1」。 

(5)如果n 是左移得到的,說明指數是正的,第30位放入「1」。如果n是右

移得到的或n=0,則第30位放入「0」。 

(6)如果n是左移得到的,則將n減去一然後化為二進位制,並在左邊加「0」

補足七位,放入第29到第23位。如果n是右移得到的或n=0,則將n化為二進位制後在

左邊加「0」補足七位,再各位求反,再放入第29到第23位。 

將乙個計算機裡儲存的實數格式轉化為通常的十進位制的格式的方法如下: 

(1)將第22位到第0位的二進位制數寫出來,在最左邊補一位「1」,得到二十

四位有效數字。將小數點點在最左邊那個「1」的右邊。 

(2)取出第29到第23位所表示的值n。當30位是「0」時將n各位求反。當30

位是「1」時將n增1。 

(3)將小數點左移n位(當30位是「0」時)或右移n位(當30位是「1」時)

,得到乙個二進位制表示的實數。 

(4)將這個二進位制實數化為十進位制,並根據第31位是「0」還是「1」加上正

號或負號即可。 

特別地,實數0用c++的float格式表示是0000000000000000000000000000000

0。 如果還不太明白,這裡舉幾個例子。 

一。將23.56化為c++的float格式。 

(1)將23.56化為二進位制後大約是「10111.1000111101011100001」。 

(2)將小數點左移四位,得到「1.01111000111101011100001」。 

(3)這已經有了二十四位有效數字,將最左邊一位「1」去掉,得到「0111

1000111101011100001」。將它放入第22到第0位。 

(4)因為23.56是正數,因此在第31位放入「1」。 

(5)由於我們把小數點左移,因此在第30位放入「1」。 

(6)因為我們是把小數點左移4位,因此將4減去1得3,化為二進位制,並補足

七位得到0000011,放入第29到第23位。 

完畢。 

如果把最左邊定為第31位,最右邊定為第0位,那麼在c++裡,float格式的2

3.56是這樣表示的:01000001101111000111101011100001。相應地-23.56就是這

樣表示的:11000001101111000111101011100001。 

二。將實數0.2356化為c++的float格式。 

(1)將0.2356化為二進位制後大約是0.00111100010100000100100000。 

(2)將小數點右移三位得到1.11100010100000100100000。 

(3)從小數點右邊數出二十三位有效數字,即11100010100000100100000放

入第22到第0位。 

(4)由於0.2356是正的,所以在第31位放入「0」。 

(5)由於我們把小數點右移了,所以在第30位放入「0」。 

(6)因為小數點被右移了3位,所以將3化為二進位制,在左邊補「0」補足七

位,得到0000011,各位取反,得到1111100,放入第29到第23位。 

完畢。因此0.2356用c++的float格式表示是:00111110011100010100000100

100000。其中最左邊一位是第31位,最右邊一位是第0位。 

三。將實數1.0化為c++的float格式。 

(1)將1.0化為二進位制後是1.00000000000000000000000。 

(2)這時不用移動小數點了,這就是我們在轉化方法裡說的n=0的情況。 

(3)將小數點右邊的二十三位有效數字00000000000000000000000放入第22

到第0位。 

(4)因為1.0是正的,所以在第31位里放入「0」。 

(5)因為n=0,所以在第30位里放入「0」。 

(6)因為n=0,所以將0補足七位得到0000000,各位求反得到1111111,放入

第29到第23位。 

完畢。所以實數1.0用c++的float格式表示是:0011111110000000000000000

0000000。其中最左邊一位是第31位,最右邊一位是第0位。

浮點數的精度取決於尾數部分。尾數部分的位數越多,能夠表示的有效數字越多。

單精度數的尾數用23位儲存,加上預設的小數點前的1位1,2^(23+1) = 16777216。因為 10^7 < 16777216 < 10^8,所以說單精度浮點數的有效位數是7位。

雙精度的尾數用52位儲存,2^(52+1) = 9007199254740992,10^16 < 9007199254740992 < 10^17,所以雙精度的有效位數是16位。

C IEEE745浮點數格式

在 ilovezks ilovezks 的大作中提到 我想求教乙個問題 c語言中float 是如何表示的?尾數,階碼是如何在32位上安排的,即哪幾位是 尾數,哪幾位是階碼,那一位是符號位。聽說與cpu有關,是真的嗎?在c 裡,實數 float 是用四個位元組即三十二位二進位制位來儲存的。其中 有1位...

C語言 浮點數格式

description 輸入n 0 n 10000 個浮點數,要求把這n個浮點數重新排列 並非排序,而是對齊 後再輸出。每個浮點數中都有小數點且總長度不超過50位。input 第1行是乙個正整數n n 10000 後面n行每行乙個浮點數,每個浮點數中都保證小數點會出現。浮點數的長度不超過50位,注意...

IEEE制定的浮點數格式

ieee制定的浮點數格式 鑑於有人問到在c語言中float和double型態的儲存格式的問題,所以我就在這邊獻醜一翻,講講我所了解的部份,如有任何錯誤,請各位大哥多多指教.ieee制定之浮點數格式說明 float型態 用4個bytes儲存,也就是32 bits.各個bit的用途如下 bit 31 2...