Skocz do zawartości
Puchacz1

[C++] kodowanie FP2

Rekomendowane odpowiedzi

piszę program do kodowania liczb w fp2. Mój problem polega na tym, że gdzieś tak konkretnie spartoliłem, że dalsze bity mantysy przypisuje błędnie. Pokazuje mi jakoś losowo 0-1 tymaczasem nie powinno. Powinno przypisać odpowiednie bity z tablicy Tab

 

#include <iostream>#include <cmath>#include <algorithm>using namespace std;//rozmiar tablicy po konwersjiint rozmiar_tab_calk = 0;int *wsk_rozm_tab_calk = &rozmiar_tab_calk; //int rozmiar_tab_rzecz=0;int *wsk_rozm_tab_rzecz = &rozmiar_tab_rzecz;int mantysa=0;int *wsk_mantysa = &mantysa;void licz_rozmiar_tab_calk (int a){    cout<< "Podaj liczbę bitów mantysy: ";    cin >> mantysa;    while(a>0)    {        *wsk_rozm_tab_calk +=1;        a /=2;    }}short int *Tab = new short int[*wsk_rozm_tab_calk + *wsk_mantysa]; //dynamiczne stworzenie tablicy :)int dec_to_bin(long int a, double b, bool wypisz ){    //konwertujemy    int i=0;    while (a > 0)    {        if(a % 2 != 0)        {            Tab[i] = 1;        }        else        {            Tab[i] = 0;        }        // tablica testowa, jeśli true to wypisuje.        if(wypisz == true)        {            cout << "Tab[" << i << "]: " << Tab[i] << endl;        }        a /= 2;        i++;    }    return 0;}int pierwsza_jedynka = 997;int *wsk_pierwsza_jedynka = &pierwsza_jedynka;int odl_przec_od_jed = 0;int *wsk_odl_przec_od_jed = &odl_przec_od_jed;int obroc_tablice (bool inicjuj, bool wypisz){    int i=0;    int pomocnicza;    int rozm_tab = *wsk_rozm_tab_calk;    while(i<*wsk_rozm_tab_calk)    {        if(i<ceil(*wsk_rozm_tab_calk/2))        {            pomocnicza = Tab[i];            Tab[i] = Tab[rozm_tab - 1];            Tab[rozm_tab - 1] = pomocnicza;            if(*wsk_pierwsza_jedynka == 997 && Tab[i] == 1)            {                *wsk_pierwsza_jedynka = i; //potrzebna do sprawdzenia na której pozycji występuje pierwsza jedynka w wyrażeniu.            }            if(wypisz == true)            {                cout << "Tab[" << i << "]: " << Tab[i] << " -> Tab[" << rozm_tab - 1 << "]: " << Tab[rozm_tab - 1] << endl;            }            rozm_tab--;        }        i++;    }    Tab[*wsk_rozm_tab_calk] = 999; //tworze przecinek xD    *wsk_odl_przec_od_jed = *wsk_rozm_tab_calk;    return true;}void dec_to_bin2(double a, int b, bool wypisz){    int i=0;    while(i<b)    {        a*=2;        if(a>0 && a<1)        {            Tab[*wsk_rozm_tab_calk+1]=0;        }        else if(a>1)        {            Tab[*wsk_rozm_tab_calk+1]=1;            a = a - floor(a);        }        else if(a==1)        {            Tab[*wsk_rozm_tab_calk+1]=1;            a=a-floor(a);        }        else        {            Tab[*wsk_rozm_tab_calk+1]=0;        }        *wsk_rozm_tab_calk +=1;        i++;    }}//ilosc bitow cechy.int rozmiar_cechy = 1;int *wsk_rozmiar_cechy = &rozmiar_cechy;void policz_rozmiar_cechy (int a, bool wypisz){    while(a > 0)    {        a /=2;        *wsk_rozmiar_cechy +=1;    }    if(wypisz == true)    {        cout<<"*wsk_rozmiar_cechy: " << *wsk_rozmiar_cechy << endl;    }}short int *fp2 = new short int[*wsk_rozmiar_cechy+*wsk_mantysa+2]; //tworzymy prawidłową tablicę z naszym fp2int kodowanie_cechy(bool wypisz, int znak){    *wsk_odl_przec_od_jed -=1; //odejmuje jeden aby zachować prawidłową odległość od pierwszej jedynki.    if(wypisz == true)    {        cout << *wsk_odl_przec_od_jed <<endl;    }    int i=2;    fp2[0]=znak;    fp2[1]=0;    while(*wsk_odl_przec_od_jed >0)    {        if(*wsk_odl_przec_od_jed % 2 != 0)        {            fp2[i] = 1;        }        else        {            fp2[i] = 0;        }        *wsk_odl_przec_od_jed /=2;        i++;    }    return i;}int kodowanie_mantysy(int j, bool wypisz){    j+=1;    int z=1;    cout << *wsk_rozmiar_cechy+*wsk_mantysa+2 << endl;    while(j<*wsk_rozmiar_cechy+*wsk_mantysa+2)    {        if(wypisz == true)        {            cout << "fp2[" << j << "]: " << fp2[j] << " = Tab[" << z << "]: " << Tab[z] << endl;        }        if(z != *wsk_rozmiar_cechy)        {            fp2[j] = Tab[z];            j++;        }        z++;    }}void skasuj_tablice (){    delete [] Tab;}void wypisz_fp2(){    for(int i=0;i<*wsk_rozmiar_cechy+*wsk_mantysa+2;i++)    {        cout << "FP2[" << i << "]: " << fp2[i] << endl;    }}void wypisz_tablice(int l){    for(int i=0;i<*wsk_rozm_tab_calk+l;i++)    {        cout << "Tab[" << i << "]: " << Tab[i] << endl;    }}void ilosc_elem(){   int ilosc_elem_tab = sizeof(Tab) / sizeof(int);   cout << ilosc_elem_tab;}//------------------------------------------------------------////-------------------------i++--------------------------------////------------------------------------------------------------//int main (){    cout << "Podaj liczbę: ";    double liczba;    cin >> liczba;    //sprawdzanie czy liczba jest ujemna    bool znak = 0;    bool *wsk_znak = &znak;    if(liczba < 0)    {        liczba = liczba * (-1);        *wsk_znak = 1;    }    // konwersja liczby zmienno przecinkowej na całkowitą.    long int licz_calk = liczba;    double licz_rzecz = liczba - licz_calk;    licz_rozmiar_tab_calk(licz_calk); // liczy rozmiar tablicy    dec_to_bin(licz_calk, licz_rzecz, false); // wypełnia tablicę 0-1;    obroc_tablice(true,false); //obraca tablicę 0-1    dec_to_bin2(licz_rzecz,*wsk_mantysa, false);    wypisz_tablice(1);    cout << "" << endl;    policz_rozmiar_cechy(*wsk_odl_przec_od_jed-1, true);    int ost_elem = kodowanie_cechy(true, znak);    fp2[ost_elem] = 999; // mój przecinek. Pozwala mi separować ceche od mantysy    kodowanie_mantysy(ost_elem, true);    cout<<""<<endl;    wypisz_fp2();    //skasuj_tablice();}

ps. chwilowo pokazuje złą cechę ale to zamierzone. Mam nadzieję, że pomożecie mi z tą mantysą. Analizuję kod i naprawdę nie wiem co jest nie tak. Może znajdzie się taka dusza która przetrawi te wypociny.

Edytowane przez Puchacz1

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...