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

Тема в разделе "C/C++/C#", создана пользователем Paha, 22 май 2011.

  1. Paha

    Paha Гость

    Требуется сложить или вычесть два числа типа 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 среда Борланд.
     
Загрузка...
Похожие Темы - Числа плавающей точкой
  1. areostar
    Ответов:
    0
    Просмотров:
    361
  2. Bisyara
    Ответов:
    0
    Просмотров:
    957
  3. mel
    Ответов:
    3
    Просмотров:
    1.362
  4. GoldenYear
    Ответов:
    0
    Просмотров:
    1.171
  5. Untiy16
    Ответов:
    0
    Просмотров:
    1.369

Поделиться этой страницей