這兩天我跟進制轉換槓上了!前面已經寫了十進制整數轉換為二進制C++實現 和十進制整數轉換為任意進制C++實現 兩篇文章簡單介紹了一下進制轉換的原理,但是之前只是對整數進行轉換。今天介紹的是將十進制小數轉換為二進制小數。由於有效位數的原因,這個浮點數轉換的結果與原本的數值之間還是存在著差異的。
之前我們將十進制整數轉換為二進制是進行除二求余,但是小數部分采用的卻是乘2取整,下面以0.8125為例,詳解過程:
0.8125 * 2 =1.625 整數部分為 1
0.625 * 2 =1.25 整數部分為 1
0.25 * 2 =0.5 整數部分為 0
0.5 * 2 =1 整數部分為 1
將上面每行乘積的整數部分從上往下連接起來就是0.1101,下面請看詳細代碼
#include<iostream>
using namespace std;
void d2b(int var,int *p){ //定義函數
int i=31,j=0, tmp; //定義函數中需要用到的變量 tmp用於交換,其他為下標
while(var>0){//當var大於0時對var求余,並除以2賦給var
p[i]=var%2;//第一個余數存貯於p[31](數組最後一位)
var=var/2;
i--;
}
i++;
//*將獲得值的起始位置遷移至p[0]
for(;i<32;j++){
tmp=p[j];
p[j]=p[i];
p[i]=tmp;
i++;
}
p[j]=-1;//將數值結尾後面設置為-1
}
void fd2b(float fen,int *pf){
int i=0;
for(;fen>0;i++){
fen =fen*2;
if(fen >=1){
pf[i]=1;
fen =fen -1;
}else{
pf[i]=0;
}
}
pf[i]=-1;
}
int main(){
int p[32]; int pf[64]; float fl;
cout<<"請輸入一個浮點數:";
cin>>fl;
int zhengshu=(int)fl;
float fenshu=fl-zhengshu;
cout<<zhengshu<<'+'<<fenshu;
d2b(zhengshu,p);fd2b(fenshu,pf);
cout<<"轉換結果為";
for(int i=0;p[i]>=0;i++)cout<<p[i];
cout<<'.';
for(int i=0;pf[i]>=0;i++)cout<<pf[i];
cout<<endl;
return 0;
}
下面為執行結果: