Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> арифметичкские операции над двоичными числами, формат с плавающей точкой 
:(
    Опции темы
ne_tru_e
  Дата 29.11.2009, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Приношу жертвы MS
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 20.1.2008

Репутация: нет
Всего: 4



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

Код

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

PM WWW Jabber   Вверх
Carlos0N
Дата 29.11.2009, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 9.10.2007

Репутация: нет
Всего: 1



я не уверен, но мне кажется работа с двоичными числами и их перевод из одной системы в другую уже реализованы в какой нибудь библиотеке с++.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.3733 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.