Puchacz1 Opublikowano 21 Lutego 2011 Zgłoś Opublikowano 21 Lutego 2011 (edytowane) 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 21 Lutego 2011 przez Puchacz1 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...