先起個頭:上次說完二,十進(jìn)制小數(shù)間怎樣轉(zhuǎn)換后,有很多小伙伴私信問我(其實(shí)一個都沒有(>﹏<))把十進(jìn)制小數(shù)先轉(zhuǎn)成分?jǐn)?shù)再轉(zhuǎn)成二進(jìn)制小數(shù)的方法只適用于分母為2的冪的分?jǐn)?shù),那0.1或者0.3這種就轉(zhuǎn)不了啊。嗯……我只能說是的,確實(shí)轉(zhuǎn)不了T_T。But,難道這種數(shù)就不做了嗎!顯然不行(┯_┯),至于怎么做待我先說完今天的主題ieee單精度浮點(diǎn)的編碼。
計算機(jī)為每個字節(jié)都給予了一個地址,ieee用4個字節(jié),也就是32位二進(jìn)制來對一個科學(xué)記數(shù)法的小數(shù)進(jìn)行編碼。
ieee表示的浮點(diǎn)數(shù)有如下四種

首先是最常見的規(guī)格化數(shù),這樣的數(shù),由于這一部分的數(shù)每個都是1.開頭,所以我們將這一位省略,從而可以多表示一位精度的小數(shù)。規(guī)格化數(shù)的階碼E=exp-bias,八位階碼的bias是127。
經(jīng)過觀察后你會發(fā)現(xiàn)最小的規(guī)格化的二進(jìn)制小數(shù)的編碼是0x00800000,將它轉(zhuǎn)為十進(jìn)制

如果要表示的小數(shù)比它還小就要用到非規(guī)格化數(shù),非規(guī)格化數(shù)的階碼E=1-bias。如將5.877e-39轉(zhuǎn)換為二進(jìn)制編碼

非規(guī)格化的還有一個重要用途是表示浮點(diǎn)的+ -0,最后注意一下這里不像規(guī)格化數(shù)那里有個隱含的1了。
剩下的兩種編碼就不說了。
現(xiàn)在再回到0.1和0.3的問題,0.1我實(shí)在是沒想到怎樣用分?jǐn)?shù)來轉(zhuǎn)成二進(jìn)制,但是可以用輾轉(zhuǎn)相乘法來得到(其實(shí)我是直接用printf打印看的(^_^)),來個圖(這是個規(guī)格化數(shù))

這樣就得到了0.1對應(yīng)的二進(jìn)制編碼,記住這個編碼后加三次就得到了0.3的編碼,或者把乘法變?yōu)橐莆缓图臃?/p>

再如0.6可以用0.5+0.1…,這樣又能解決一大批二進(jìn)制的轉(zhuǎn)換問題了。
最后,以上內(nèi)容均摘自csapp,如有雷同…嗯……