Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<cmath>
- using namespace std;
- union ufloat //unia dzięki której można zamienić f na wartość całkowitoliczbową(bity zostają te same)
- {
- float f;
- int u;
- };
- bool* zamiana_na_ieee754(float f)
- {
- bool *tab;
- tab=new bool[32];
- unsigned b,i=32;
- ufloat a; //utworzenie instancji unii
- a.f=f; //przypisanie pola zmiennoprzecinkowego do unii
- b=a.u; // odczytanie pola całkowitoliczbowego do zmiennej b
- while(i!=0)
- {
- i--;
- if(b&1) //jeżeli ostatnia wartość w b jest 1
- tab[i]=1; //dodaj 1 do tablicy
- else //jeżeli nie
- tab[i]=0; //dodaj 0 do tablicy
- b>>=1; //przesun liczbę b o jeden bit w prawo
- }
- return tab;
- }
- float zamiana_na_dec(bool* tab)
- {
- int i=0;
- unsigned b=0;
- while(i<31)
- {
- b += tab[i]; //do b dodaj tab[i]
- b<<=1; //przesun b o 1 bit w lewo
- i++;
- }
- ufloat a;
- a.u=b;
- return a.f;
- }
- bool* dodawanie(bool* a, bool*b)
- {
- int znaka = a[0] ? -1 : 1; //jeżeli a[0] jest 1 ustaw zn na -1 w przeciwnym razie ustaw zn na 1
- int znakb = b[0] ? -1 : 1; //jeżeli b[0] jest 1 ustaw zn na -1 w przeciwnym razie ustaw zn na 1
- int cechaa = -127, cechab = -127; //eksponenty
- float mantysaa = 1, mantysab = 1; //mantysy
- int p = 128; //p i q to liczby do obliczenia eksponent i mantys
- float q = 0.5;
- for (int i = 1; i<9; i++) //obiczanie eksponent
- {
- cechaa += p * a[i];
- cechab += p * b[i];
- p = p / 2;
- }
- for (int i = 9; i<32; i++) //obliczanie mantys
- {
- mantysaa += a[i] * q;
- mantysab += b[i] * q;
- q = q / 2;
- }
- float wynik = (znaka*mantysaa + znakb * mantysab*pow(2, cechab - cechaa))*pow(2, cechaa); //obliczanie wyniku wg wzoru
- return zamiana_na_ieee754(wynik);
- }
- bool* odejmowanie(bool* a, bool*b)
- { //za - znak a zb - znak b ea - cecha a eb - cecha b ma - mantysa a mb - mantysa b
- int znaka = a[0] ? -1 : 1; //jeżeli a[0] jest 1 ustaw zn na -1 w przeciwnym razie ustaw zn na 1
- int znakb = b[0] ? -1 : 1; //jeżeli b[0] jest 1 ustaw zn na -1 w przeciwnym razie ustaw zn na 1
- int cechaa = -127, cechab = -127; //eksponenty
- float mantysaa = 1, mantysab = 1; //mantysy
- int p = 128; //p i q to liczby do obliczenia eksponent i mantys
- float q = 0.5;
- for (int i = 1; i<9; i++) //obiczanie eksponent
- {
- cechaa += p * a[i];
- cechab += p * b[i];
- p = p / 2;
- }
- for (int i = 9; i<32; i++) //obliczanie mantys
- {
- mantysaa += a[i] * q;
- mantysab += b[i] * q;
- q = q / 2;
- }
- float wynik = (znaka*mantysaa - znakb * mantysab*pow(2, cechab - cechaa))*pow(2, cechaa); //obliczanie wyniku wg wzoru
- return zamiana_na_ieee754(wynik);
- }
- bool* mnozenie(bool* a, bool*b)
- {
- int znaka = a[0] ? -1 : 1;
- int znakb = b[0] ? -1 : 1;
- int cechaa = -127, cechab = -127;
- float mantysaa = 1, mantysab = 1;
- int p = 128;
- float q = 0.5;
- for (int i = 1; i<9; i++)
- {
- cechaa += p * a[i];
- cechab += p * b[i];
- p = p / 2;
- }
- for (int i = 9; i<32; i++)
- {
- mantysaa += a[i] * q;
- mantysab += b[i] * q;
- q = q / 2;
- }
- float wynik = znaka * znakb*mantysaa*mantysab*pow(2, cechaa + cechab);
- return zamiana_na_ieee754(wynik);
- }
- bool* dzielenie(bool* a, bool*b)
- {
- int znaka = a[0] ? -1 : 1;
- int znakb = b[0] ? -1 : 1;
- int cechaa = -127, cechab = -127;
- int suma=0, sumab=0;
- float mantysaa = 1, mantysab = 1;
- int p = 128;
- float q = 0.5;
- for (int i = 1; i<9; i++)
- {
- suma += a[i];
- sumab += b[i];
- cechaa += p * a[i];
- cechab += p * b[i];
- p = p / 2;
- }
- for (int i = 9; i<32; i++)
- {
- suma += a[i];
- sumab += b[i];
- mantysaa += a[i] * q;
- mantysab += b[i] * q;
- q = q / 2;
- }
- float wynik = znaka * znakb*(mantysaa / mantysab)*pow(2, cechaa - cechab);
- return zamiana_na_ieee754(wynik);
- }
- void wypisz_ieee(bool* tab)
- {
- for (int i = 0; i<32; i++)
- cout << tab[i];
- }
- int main()
- {
- int litera;
- do
- {
- std::cout << "Podaj litere a aby zakonczyc petle" << std::endl;
- std::cin >> litera;
- std::cout << "Podales litere" << litera << std::endl;
- } while( litera != "a" );
- std::cout << "Koniec" << std::endl;
- }
- {
- float liczba;
- bool *x, *y,*z; //wskaźniki na tablice alokowane w zamianie na iee754
- float liczba1, liczba2;
- cout << "Podaj liczbe x: ";
- cin >> liczba1;
- cout << "Podaj liczbe y: ";
- cin >> liczba2;
- cout << "\n";
- x = zamiana_na_ieee754(liczba1);
- cout << "Liczba x w IEEE754 to: ";
- wypisz_ieee(x);
- cout << "\nZnak - "<<x[0]<<"\n"<<"Cecha - ";
- for (int i = 1; i < 9; i++)
- cout << x[i];
- cout << "\nMantysa - ";
- for (int i = 9; i < 32; i++)
- cout << x[i];
- cout << "\n";
- y = zamiana_na_ieee754(liczba2);
- cout << "\nLiczba y w IEEE754 to: ";
- wypisz_ieee(y);
- cout << "\nZnak - " << y[0] << "\n" << "Cecha - ";
- for (int i = 1; i < 9; i++)
- cout << y[i];
- cout << "\nMantysa - ";
- for (int i = 9; i < 32; i++)
- cout << y[i];
- cout << "\n\n";
- z = dodawanie(x, y);
- cout << "x + y = ";
- wypisz_ieee(z);
- cout<< " | " <<zamiana_na_dec(z)<< endl;
- z = odejmowanie(x, y);
- cout << "x - y = ";
- wypisz_ieee(z);
- cout << " | " << zamiana_na_dec(z) << endl;
- z = mnozenie(x, y);
- cout << "x * y = ";
- wypisz_ieee(z);
- cout << " | " << zamiana_na_dec(z) << endl;
- z = dzielenie(x, y);
- cout << "x / y = ";
- wypisz_ieee(z);
- cout << " | " << zamiana_na_dec(z) << endl;
- delete[] x, y, z; // zwalnianie pamięci
- cin >> liczba; // zatrzymanie konsoli
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement