先起個(gè)頭:上次說完二,十進(jìn)制小數(shù)間怎樣轉(zhuǎn)換后尔当,有很多小伙伴私信問我(其實(shí)一個(gè)都沒有(>﹏<))把十進(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ì)算機(jī)為每個(gè)字節(jié)都給予了一個(gè)地址简软,ieee用4個(gè)字節(jié)蛮拔,也就是32位二進(jìn)制來對(duì)一個(gè)科學(xué)記數(shù)法的小數(shù)進(jìn)行編碼。
ieee表示的浮點(diǎn)數(shù)有如下四種
首先是最常見的規(guī)格化數(shù)替饿,這樣的數(shù)语泽,由于這一部分的數(shù)每個(gè)都是1.開頭,所以我們將這一位省略视卢,從而可以多表示一位精度的小數(shù)踱卵。規(guī)格化數(shù)的階碼E=exp-bias,八位階碼的bias是127据过。
經(jīng)過觀察后你會(huì)發(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ī)格化的還有一個(gè)重要用途是表示浮點(diǎn)的+ -0西饵,最后注意一下這里不像規(guī)格化數(shù)那里有個(gè)隱含的1了。
剩下的兩種編碼就不說了鳞芙。
現(xiàn)在再回到0.1和0.3的問題眷柔,0.1我實(shí)在是沒想到怎樣用分?jǐn)?shù)來轉(zhuǎn)成二進(jìn)制期虾,但是可以用輾轉(zhuǎn)相乘法來得到(其實(shí)我是直接用printf打印看的(^_^)),來個(gè)圖(這是個(gè)規(guī)格化數(shù))
這樣就得到了0.1對(duì)應(yīng)的二進(jìn)制編碼驯嘱,記住這個(gè)編碼后加三次就得到了0.3的編碼镶苞,或者把乘法變?yōu)橐莆缓图臃?/p>
再如0.6可以用0.5+0.1…,這樣又能解決一大批二進(jìn)制的轉(zhuǎn)換問題了鞠评。
最后茂蚓,以上內(nèi)容均摘自csapp,如有雷同…嗯……