Advertisement
Guest User

Untitled

a guest
Jun 13th, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.33 KB | None | 0 0
  1. #include<iostream>
  2. #include<cmath>
  3. using namespace std;
  4. union ufloat //unia dzięki której można zamienić f na wartość całkowitoliczbową(bity zostają te same)
  5. {
  6. float f;
  7. int u;
  8. };
  9. bool* zamiana_na_ieee754(float f)
  10. {
  11. bool *tab;
  12. tab=new bool[32];
  13. unsigned b,i=32;
  14. ufloat a; //utworzenie instancji unii
  15. a.f=f; //przypisanie pola zmiennoprzecinkowego do unii
  16. b=a.u; // odczytanie pola całkowitoliczbowego do zmiennej b
  17. while(i!=0)
  18. {
  19. i--;
  20. if(b&1) //jeżeli ostatnia wartość w b jest 1
  21. tab[i]=1; //dodaj 1 do tablicy
  22. else //jeżeli nie
  23. tab[i]=0; //dodaj 0 do tablicy
  24. b>>=1; //przesun liczbę b o jeden bit w prawo
  25. }
  26. return tab;
  27. }
  28. float zamiana_na_dec(bool* tab)
  29. {
  30. int i=0;
  31. unsigned b=0;
  32. while(i<31)
  33. {
  34. b += tab[i]; //do b dodaj tab[i]
  35. b<<=1; //przesun b o 1 bit w lewo
  36. i++;
  37. }
  38. ufloat a;
  39. a.u=b;
  40. return a.f;
  41. }
  42. bool* dodawanie(bool* a, bool*b)
  43. {
  44. int znaka = a[0] ? -1 : 1; //jeżeli a[0] jest 1 ustaw zn na -1 w przeciwnym razie ustaw zn na 1
  45. int znakb = b[0] ? -1 : 1; //jeżeli b[0] jest 1 ustaw zn na -1 w przeciwnym razie ustaw zn na 1
  46. int cechaa = -127, cechab = -127; //eksponenty
  47. float mantysaa = 1, mantysab = 1; //mantysy
  48. int p = 128; //p i q to liczby do obliczenia eksponent i mantys
  49. float q = 0.5;
  50. for (int i = 1; i<9; i++) //obiczanie eksponent
  51. {
  52. cechaa += p * a[i];
  53. cechab += p * b[i];
  54. p = p / 2;
  55. }
  56. for (int i = 9; i<32; i++) //obliczanie mantys
  57. {
  58. mantysaa += a[i] * q;
  59. mantysab += b[i] * q;
  60. q = q / 2;
  61. }
  62. float wynik = (znaka*mantysaa + znakb * mantysab*pow(2, cechab - cechaa))*pow(2, cechaa); //obliczanie wyniku wg wzoru
  63. return zamiana_na_ieee754(wynik);
  64. }
  65. bool* odejmowanie(bool* a, bool*b)
  66. { //za - znak a zb - znak b ea - cecha a eb - cecha b ma - mantysa a mb - mantysa b
  67. int znaka = a[0] ? -1 : 1; //jeżeli a[0] jest 1 ustaw zn na -1 w przeciwnym razie ustaw zn na 1
  68. int znakb = b[0] ? -1 : 1; //jeżeli b[0] jest 1 ustaw zn na -1 w przeciwnym razie ustaw zn na 1
  69. int cechaa = -127, cechab = -127; //eksponenty
  70. float mantysaa = 1, mantysab = 1; //mantysy
  71. int p = 128; //p i q to liczby do obliczenia eksponent i mantys
  72. float q = 0.5;
  73. for (int i = 1; i<9; i++) //obiczanie eksponent
  74. {
  75. cechaa += p * a[i];
  76. cechab += p * b[i];
  77. p = p / 2;
  78. }
  79. for (int i = 9; i<32; i++) //obliczanie mantys
  80. {
  81. mantysaa += a[i] * q;
  82. mantysab += b[i] * q;
  83. q = q / 2;
  84. }
  85. float wynik = (znaka*mantysaa - znakb * mantysab*pow(2, cechab - cechaa))*pow(2, cechaa); //obliczanie wyniku wg wzoru
  86. return zamiana_na_ieee754(wynik);
  87. }
  88. bool* mnozenie(bool* a, bool*b)
  89. {
  90. int znaka = a[0] ? -1 : 1;
  91. int znakb = b[0] ? -1 : 1;
  92. int cechaa = -127, cechab = -127;
  93. float mantysaa = 1, mantysab = 1;
  94. int p = 128;
  95. float q = 0.5;
  96. for (int i = 1; i<9; i++)
  97. {
  98. cechaa += p * a[i];
  99. cechab += p * b[i];
  100. p = p / 2;
  101. }
  102. for (int i = 9; i<32; i++)
  103. {
  104. mantysaa += a[i] * q;
  105. mantysab += b[i] * q;
  106. q = q / 2;
  107. }
  108. float wynik = znaka * znakb*mantysaa*mantysab*pow(2, cechaa + cechab);
  109. return zamiana_na_ieee754(wynik);
  110. }
  111.  
  112. bool* dzielenie(bool* a, bool*b)
  113. {
  114. int znaka = a[0] ? -1 : 1;
  115. int znakb = b[0] ? -1 : 1;
  116. int cechaa = -127, cechab = -127;
  117. int suma=0, sumab=0;
  118. float mantysaa = 1, mantysab = 1;
  119. int p = 128;
  120. float q = 0.5;
  121. for (int i = 1; i<9; i++)
  122. {
  123. suma += a[i];
  124. sumab += b[i];
  125. cechaa += p * a[i];
  126. cechab += p * b[i];
  127. p = p / 2;
  128. }
  129. for (int i = 9; i<32; i++)
  130. {
  131. suma += a[i];
  132. sumab += b[i];
  133. mantysaa += a[i] * q;
  134. mantysab += b[i] * q;
  135. q = q / 2;
  136. }
  137. float wynik = znaka * znakb*(mantysaa / mantysab)*pow(2, cechaa - cechab);
  138. return zamiana_na_ieee754(wynik);
  139. }
  140. void wypisz_ieee(bool* tab)
  141. {
  142. for (int i = 0; i<32; i++)
  143. cout << tab[i];
  144. }
  145. int main()
  146. {
  147. int litera;
  148. do
  149. {
  150. std::cout << "Podaj litere a aby zakonczyc petle" << std::endl;
  151. std::cin >> litera;
  152. std::cout << "Podales litere" << litera << std::endl;
  153. } while( litera != "a" );
  154. std::cout << "Koniec" << std::endl;
  155. }
  156. {
  157. float liczba;
  158. bool *x, *y,*z; //wskaźniki na tablice alokowane w zamianie na iee754
  159. float liczba1, liczba2;
  160. cout << "Podaj liczbe x: ";
  161. cin >> liczba1;
  162. cout << "Podaj liczbe y: ";
  163. cin >> liczba2;
  164. cout << "\n";
  165.  
  166. x = zamiana_na_ieee754(liczba1);
  167. cout << "Liczba x w IEEE754 to: ";
  168. wypisz_ieee(x);
  169. cout << "\nZnak - "<<x[0]<<"\n"<<"Cecha - ";
  170. for (int i = 1; i < 9; i++)
  171. cout << x[i];
  172. cout << "\nMantysa - ";
  173. for (int i = 9; i < 32; i++)
  174. cout << x[i];
  175. cout << "\n";
  176.  
  177. y = zamiana_na_ieee754(liczba2);
  178. cout << "\nLiczba y w IEEE754 to: ";
  179. wypisz_ieee(y);
  180. cout << "\nZnak - " << y[0] << "\n" << "Cecha - ";
  181. for (int i = 1; i < 9; i++)
  182. cout << y[i];
  183. cout << "\nMantysa - ";
  184. for (int i = 9; i < 32; i++)
  185. cout << y[i];
  186. cout << "\n\n";
  187.  
  188. z = dodawanie(x, y);
  189. cout << "x + y = ";
  190. wypisz_ieee(z);
  191. cout<< " | " <<zamiana_na_dec(z)<< endl;
  192. z = odejmowanie(x, y);
  193. cout << "x - y = ";
  194. wypisz_ieee(z);
  195. cout << " | " << zamiana_na_dec(z) << endl;
  196. z = mnozenie(x, y);
  197. cout << "x * y = ";
  198. wypisz_ieee(z);
  199. cout << " | " << zamiana_na_dec(z) << endl;
  200. z = dzielenie(x, y);
  201. cout << "x / y = ";
  202. wypisz_ieee(z);
  203. cout << " | " << zamiana_na_dec(z) << endl;
  204. delete[] x, y, z; // zwalnianie pamięci
  205. cin >> liczba; // zatrzymanie konsoli
  206. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement