Konwersja liczby z reprezentacji dziesiętnej na binarną i z powrotem
Transkrypt
Konwersja liczby z reprezentacji dziesiętnej na binarną i z powrotem
Konwersja liczby z reprezentacji dziesiętnej na binarną i z powrotem
// liczba całkowita: dziesiętna na binarną:
// dziel liczbę przez 2 i zbieraj reszty z dzielenia
string binarna(int d) {
string b = "";
while (d>0) {
if (d%2 == 1) b = '1' + b; else b = '0' + b;
d /= 2;
}
return b;
}
// liczba całkowita: binarna na dziesiętną
// zacznij od najmniej znaczącej cyfry, o wadze 1
// jeśli cyfra jest równa 1, to dodaj wagę do wartości dziesiętnej,
// pomnóż wagę przez 2 dla następnej cyfry
int dziesietna(string b) {
int d = 0;
int waga = 1;
for (int i=b.length()-1; i>=0; i--) {
if (b[i]=='1') d = d + waga;
waga *= 2;
}
return d;
}
// ułamek: dziesiętny na binarny:
// jeśli waga cyfry binarnej mieści się w ułamku to dopisz cyfrę 1 i odejmij wagę od ułamka, // w przeciwnym razie dopisz cyfrę 0,
// dziel wagę przez 2 dla następnej cyfry
string binarnyUlamek(double y) {
string b = "";
double waga = 0.5;
while (y>0 && b.length()<20) {
if (y>=waga) {
b = b + '1';
y -= waga;
}
else b = b + '0';
waga /= 2;
}
return b;
}
// zacznij od wagi 0.5
// ogranicz do max 20 cyfr długość rozwinięcia binarnego
// ułamek: binarny na dziesiętny
// zacznij od najmniej znaczącej cyfry, o wadze 0.5
// jeśli cyfra jest równa 1, to dodaj wagę do wartości dziesiętnej,
// podziel wagę przez 2 dla następnej cyfry
double dziesietnyUlamek(string b) {
double d = 0;
double waga = 0.5;
for (int i=0; i<b.length(); i++) {
if (b[i]=='1') d = d + waga;
waga /= 2;
}
return d;
}
Przykład zastosowania tych funkcji w programie
#include <iostream>
using namespace std;
int main() {
double x;
cout << "daj liczbe rzeczywistą w reprezentacji dziesiętnej ";
cin >> x;
int c = int(x);
// część całkowita liczby x
double u = x-c;
// część ułamkowa liczby x
// konwersja do reprezentacji binarnej
string bc = binarna(c);
string bu = binarnyUlamek(u);
string wynik = bc + "." + bu;
cout << wynik << endl;
// konwersja z powrotem do reprezentacji dziesietnej
cout << "z powrotem\n";
cout << dziesietna(bc) + dziesietnyUlamek(bu) << endl;
}
return 0;
Przykład:
daj liczbe rzeczywistą w reprezentacji dziesiętnej 3.14
11.00100011110101110000
z powrotem
3.14