Re: [問題] 二進位轉float.double

作者: alan23273850   2017-11-08 22:50:27
※ 引述《eecheng87 (EEcheng)》之銘言:
: 如題,我想輸入010011......想得到output 為 浮點數
: 我的方法是 將0100....讀成字串(char陣列) 在讀陣列0,1..看看是0還是1
: ,在賦值給整數陣列,再拿這些整數陣列用IEEE的方法算回float,double.
: 這個方法感覺可行,想和各位大大請教是否有更smart的方法可以分享??
其實真正引起我好奇的地方是,直接用型態轉型可不可行?
int my_int = 0;
int arr[32];
for(int i=0; i<32; i++) {
my_int <<= 1;
my_int += arr[i];
}
這樣會得到一個整數 my_int,這 32 個 bit 就包含了你要的資訊,
接著試著印出 printf("%f\n", my_int),會不會是 IEEE754 的結果,
如果是的話,應該可先用 sprintf(str_float, "%f", my_int) 轉成 float string,
再透過 my_flaot = atof(str_float) 轉成真正的浮點數。
如果途中遇到 big endian 或 little endian 的問題,做 bit reversal 即可。
我沒試過,就交給你了。
作者: Lipraxde (Lipraxde)   2017-11-08 23:31:00
都可以當浮點數print了,不直接轉成浮點數就好?為什麼要先轉字串再轉回去?
作者: alan23273850   2017-11-08 23:34:00
因為我不知道有什麼函式可以「直接」轉成浮點數利用內建函式能自動轉換的特性是一個 workaround這也正是原PO要問的重點,不然自己寫一個函式根據它的定義慢慢乘起來再相加當然也可,但那就不smart了
作者: Lipraxde (Lipraxde)   2017-11-08 23:37:00
上篇才有人提union捏,這個應該可以拿來用
作者: alan23273850   2017-11-08 23:37:00
而且其實我也還沒試過這段code可不可行,要等原PO對對,我覺得union應該也可以用,期待原PO分享
作者: eecheng87 (EEcheng)   2017-11-09 00:46:00
謝謝各位踴躍的幫忙我,我剛剛已經成功了礙於下禮拜才收作業,我下禮拜再將我的方法分享給大家^^
作者: wei115 (ㄎㄎ)   2017-11-09 11:44:00
剛剛實驗過惹,好像不行,但可以用一個float的指標指向int再printf出來,這樣是ok的
作者: Lipraxde (Lipraxde)   2017-11-09 11:52:00
因為轉型不是直接拿來用,會換算,要不換算的話就要用pointer, union
作者: alan23273850   2017-11-09 13:08:00
哦哦感謝樓上幾位大大,我之後有時間會自己再試一下

Links booklink

Contact Us: admin [ a t ] ucptt.com