作者eecheng87 (EEcheng)
看板C_and_CPP
標題[心得] 浮點和十進位轉換之3種方法
時間Tue Nov 14 20:03:04 2017
有鑑於這次程設課出的作業,我想和大家分享3種不同方式轉換十進位和
浮點數,礙於版面,我將以片段程式碼呈現
1.指標強制轉換型態
float a ;
int*b ;
scanf("%f",a);
b = (int*)&a ; //只有int才能和做位元運算,所以轉成整數
for ( j = 31 ; j>=0 ; j--)
if ( *b & 1 << j) //&為bit運算子 非&&,而用意是在test b的二進位每個
位置是0還是1,若為1(true)則印出1
printf("1");
else
printf("0");
...........如何做相反的動作呢??
float* f ;
int test=0 , a[32];
char b[32];
scanf("%s",b);//將01000...讀成字串
for(i=0 ; i<32 ; i++)
if( b[i] =='1')
a[i]=1;
else
a[i]=0;
for(i=0 ; i<32 ; i++){
test = test << 1;
test = test + a[i]; } //此步驟也是為甚麼要將字元陣列轉整數陣列
f = (float*)&test ; //同樣的技巧 最後在印出float,注意+*
printf(......,*f);
2. union
概念就是宣告 int 和 float 在同一個union 利用共用記憶體的概念
印出bit pattern
union test {
float f ;
int a ;
};
union test TEST //宣告
scanf("%f",TEST.f);
for(i=31 ; i>=0 ;i--)
if( TEST.a & 1<<i) //因為共用記憶體 所以float(32bit)和int每個bit紀錄的
010...是一樣的,所以test 整數內的bit 並印出
printf("1");
else
printf("0");
..........如何反過來呢??
同樣讀成字串再轉整數陣列(不再冗述)
int test ;
int c[32];
for ( i=0 ; i<32 ; i++)
{ test = test <<1;
test = test + c[i];
}
TEST.a = test ; //將讀到的010...存入整數在asign給union內的
int,透過共用記憶體 ,此刻float存的東西(二進位)
已經一樣,直接印出float即可
printf("%f",TEST.f);
3. bit field
非常繁瑣,概念就是在struct中宣告32次變數並給予bit field 1 ,
再將這個struct放入union中 ,而union內還有一個float
struct test { unsigned a1:1 , a2:1 .......a32:1};
union k { struct test TEST;
float f ;};
union k K ;
scanf("%f",K.f);
printf("%d"%d"......,K.TEST.a32,K.TEST.a31,.....) // 值得注意的是記得要反過
來印,因為bit field的記憶體位置是反過來設的
a32 a31 a30......
1 1 1 (bit)
大概是這樣 所以先讀的會放到最後宣告的bit field
那如何反過來做呢??
同樣的先將字串變成整數陣列
再將每個 整數陣列(非0則1)asign給 union內的struct的a
由於過於繁瑣 給一個範例
K.TEST.a32 = c[0] ; //該注意的地方也是要反著asign.同樣的理由
...
....
printf("%f",K.f);
今天的分享大概到這裡
由於第一次分享文章,若有疏漏請指正,感謝各位大大!!
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.116.110.8
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1510660987.A.EAE.html
推 chuegou: 其實這問題滿常被問的 大約一季一次吧 小弟我以前也回過 11/14 20:25
→ chuegou: 不過我沒列最後一種 11/14 20:26
推 stupid0319: 如果是浮點數跟整數之間的轉換呢?要研究一下嗎 11/14 20:47
→ stupid0319: 有想過100.5轉成整數的話,是100還是101? 11/14 20:48
推 Ommm5566: 當然是看選round還是ceiling或floor阿 11/14 23:12
→ Lipraxde: 你是要轉成raw bit,講成轉十進位會讓人誤會= = 11/15 00:52
推 alan23273850: 推樓上,我剛開始以為是十進位 兩個差那麼多....... 11/15 01:05
→ alan23273850: 嚴格說起來raw bit是修正過後的二進位 11/15 01:06
→ F04E: 完全不曉得做這件事的意義 11/15 18:03