Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > арифметичкские операции над двоичными числами


Автор: ne_tru_e 29.11.2009, 14:33
Есть программа, которая переводит десятичные числа в двоичные формата с плавающей точкой.
помогите реализовать операции сложения, умножения, вычитания и деления над двоичными числами

Код

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];
   }
}

Автор: Carlos0N 29.11.2009, 17:21
я не уверен, но мне кажется работа с двоичными числами и их перевод из одной системы в другую уже реализованы в какой нибудь библиотеке с++.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)