Числа с плавающей точкой

  • Автор темы Paha
  • Дата начала
P

Paha

Гость
#1
Требуется сложить или вычесть два числа типа float, представленные как unsigned long int..
#include <iostream.h>

float schet (unsigned long x,unsigned long y, char z )
{
long unsigned int znch1,znch2,znch3,znpor1,znpor2,znpor3,por1,por2,por3,mant1,mant2,mant3,rez;
znch1=x&0x80000000;
znch2=y&0x80000000;
znpor1=x&0x40000000;
znpor2=y&0x40000000;
por1=x&0x3F800000;
por2=y&0x3F800000;
mant1=x&0x007FFFFF;
mant2=y&0x007FFFFF;
if (z == '+')
{ if (znch1==znch2)
{znch3 = znch1;
if (znpor1 == znpor2)
{ znpor3 = znpor1 ;
if (por1==por2)
{ por3 = por1;
mant3 = mant1|mant2 ;
int k=0;
while (mant3>1048575)
{
mant3 >>=1;
k++;
}
por3=por3+k;
rez = znch3|znpor3|por3|mant3 ;
return (rez);
}
else
{ if (por1>por2)
{ int k = por1-por2;
mant1 >>k;
mant3 = mant1|mant2;
por3 = por1;
rez = znch3 | znpor3 | por3 | mant3;
return (rez);
}
else
{ int k = por2-por1;
mant2 >>k;
mant3 = mant1|mant2;
por3 = por2;
rez = znch3 | znpor3 | por3 | mant3;
return (rez);
}
}
}
else
{ if (znpor1>znpor2)
{ mant2>>=por2;
znpor3=znpor1;
if (por1==por2)
{ por3 = por1 ;
mant3 = mant1 | mant2 ;
int k=0;
while (mant3>1048575)
{
mant3 >>=1;
k++;
}
por3=por3+k;
rez = znch3 | znpor3 | por3 | mant3 ;
return (rez);
}
else
{ if (por1>por2)
{ int k = por1-por2;
mant1 >>=k;
mant3 = mant1|mant2;
por3 = por1;
rez = znch3 | znpor3 | por3 | mant3;
return (rez);
}
else
{ int k = por2-por1;
mant2 >>=k;
mant3 = mant1|mant2;
por3 = por2;
rez = znch3 | znpor3 | por3 | mant3;
return (rez);
}
}
}
if (znpor1<znpor2)
{ mant1>>=por1;
znpor3=znpor2;
if (por1==por2)
{ por3 = por1 ;
mant3 = mant1 | mant2 ;
int k=0;
while (mant3>1048575)
{
mant3 >>=1;
k++;
}
por3=por3+k;
rez = znch3 | znpor3 | por3 | mant3 ;
return (rez);
}
else
{ if (por1>por2)
{ int k = por1-por2;
mant1 >>=k;
mant3 = mant1|mant2;
por3 = por1;
rez = znch3 | znpor3 | por3 | mant3;
return (rez);
}
else
{ int k = por2-por1;
mant2 >>=k;
mant3 = mant1|mant2;
por3 = por2;
rez = znch3 | znpor3 | por3 | mant3;
return (rez);
}
}
}
}
}
else
{if (znch1>znch2)
{if (znpor1 == znpor2)
{ znpor3 = znpor1 ;
if (por1==por2)
{ por3 = 0 ;
mant3 = mant1&&mant2 ;
int k=0;
while (mant3>1048575)
{
mant3 >>=1;
k++;
}
por3=por3+k;
rez = znch3 | znpor3 | por3 | mant3 ;
return (rez);
}
else
{ if (por1>por2)
{ int k = por1-por2;
mant1 >>=k;
mant3 = mant1+mant2;
por3 = por1;
rez = znch3 | znpor3 | por3 | mant3;
return (rez);
}
else
{ int k = por2-por1;
mant2 >>=k;
mant3 = mant1+mant2;
por3 = por2;
rez = znch3 | znpor3 | por3 | mant3;
return (rez);
}
}
}
}
}
}
}

void main()
{union pole {float a; unsigned long b;};
char f;
pole x, y, z;
cout <<"\n Vvedite pervoe chislo ";
cin >>x.a;
cout <<"\n vvedite vtoroe chislo ";
cin>>y.a;
cout <<"\n vvedite - or + " <<"\n";
cin >> f;
if ((f!= '+') && (f!='-'))
cout << "\n oshibka";
else
{z.b = schet (x.b, y.b,f);
cout <<"Otvet = "<<z.a;
}
}
Что тут не так (она не до конца сделана, учитывается только знак "+") при одинаковых числах он складывает только дробную часть.. а при разнах так совсем что-то страшное, подскажите что-нибудь..
P.S среда Борланд.