Есть программа, которая переводит десятичные числа в двоичные формата с плавающей точкой. помогите реализовать операции сложения, умножения, вычитания и деления над двоичными числами | Код | typedef struct Tieee754 { int znak; AnsiString exp; AnsiString mant; }*a,*b,*c; //--------------------------------------------------------------------------- AnsiString dectobin (float code) { AnsiString rez; int i=0; if (code>=1) {int cel=(int)code; rez="" ; while (cel>0) {rez =IntToStr(cel%2)+rez; cel = cel/2; } } else {rez="" ; while (code>0) if (code*2>=1) {rez +="1"; code= code*2-1;} else {rez +="0"; code= code*2;} } if (code==0)rez="0"; return rez; } //--------------------------------------------------------------------------- int bintodec (AnsiString code) { int rez=0; for (int i=0;i<code.Length();i++) rez+=StrToInt(code[code.Length()-i])*pow(2,i); return rez; } //--------------------------------------------------------------------------- float bintodec_float (AnsiString code) { float rez=0; for (int i=1;i<code.Length();i++) rez+=StrToInt(code[i])*pow(2,-i); return rez; } //--------------------------------------------------------------------------- Tieee754 To_ieee754(float x) { Tieee754 rez;
if (x<0) rez.znak=1; else rez.znak=0; if (x<0) x=-x;
float cel= Floor(x); float drob=x-cel; rez.exp="";rez.mant=""; AnsiString cel_bin= dectobin(cel); AnsiString drob_bin= dectobin(drob); AnsiString exp_bin; AnsiString mant_bin;
int k=1; if ((x<1)&&(x!=0)) {while(drob_bin[k]!='1') k++; exp_bin=dectobin(pow(2,18)-1-k); mant_bin=drob_bin.SubString(k+1,drob_bin.Length()-k); } else if (x>=1) {exp_bin=dectobin(cel_bin.Length()-1+pow(2,18)-1); mant_bin=cel_bin.SubString(2,cel_bin.Length()-1)+ drob_bin; } else {exp_bin="0"; mant_bin="0"; }
int j=19; while (j-exp_bin.Length()!=0) { rez.exp+='0'; j--; } rez.exp+=exp_bin ;
if (mant_bin.Length()>=12) rez.mant=mant_bin.SubString(1,12); else {rez.mant=mant_bin; for (int i=mant_bin.Length()+1;i<13;i++) rez.mant+='0'; } return rez; } //--------------------------------------------------------------------------- float To_float(Tieee754 u) { float rez; AnsiString cel_bin=""; int cel_int=0; AnsiString drob_bin=""; float drob_float=0;
int exp_dec=bintodec(u.exp)-pow(2,18)+1 ; if (exp_dec>=0) { cel_bin= "1"+ u.mant.SubString(1,exp_dec); cel_int= bintodec(cel_bin); drob_bin=u.mant.SubString(exp_dec+1,12-exp_dec); } else { for(int i=1;i<abs(exp_dec);i++) drob_bin+='0'; drob_bin+="1"+u.mant.SubString(1,12); } drob_float= bintodec_float(drob_bin); rez= cel_int+drob_float; if (u.znak==1)rez=-rez; return rez; } //--------------------------------------------------------------------------- void vivod(Tieee754 u1,Tieee754 u2,Tieee754 u3) { Form1->ZnakGr1->Cells[0][0]=u1.znak; for ( int i=0;i<19;i++) { Form1->ExpGr1->Cells[i][0]=u1.exp[i+1]; } for ( int i=0;i<12;i++) { Form1->MantGr1->Cells[i][0]=u1.mant[i+1]; }
Form1->ZnakGr2->Cells[0][0]=u2.znak; for ( int i=0;i<19;i++) { Form1->ExpGr2->Cells[i][0]=u2.exp[i+1]; } for ( int i=0;i<12;i++) { Form1->MantGr2->Cells[i][0]=u2.mant[i+1]; }
Form1->ZnakGr3->Cells[0][0]=u3.znak; for ( int i=0;i<19;i++) { Form1->ExpGr3->Cells[i][0]=u3.exp[i+1]; } for ( int i=0;i<12;i++) { Form1->MantGr3->Cells[i][0]=u3.mant[i+1]; } }
|
|