[C++] Reprezentacja liczb w reprezentacji IEEE-754

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
patryk007@vp.pl

[C++] Reprezentacja liczb w reprezentacji IEEE-754

Post autor: patryk007@vp.pl »

Chciałem napisać program, który by pobierał liczbę zmienno przecinkową i wypisywał reprezentację w kodzie IEEE-754.

Nie bardzo wiedziałem jak to zrobić ale znalazłem program, który to realizuje, oto on:

Kod: Zaznacz cały

#include <iostream>
using namespace std;

void binarnie(long int liczba, int poczatek, int ile_bitow)
{
	for (; ile_bitow > 0; poczatek--, ile_bitow--)
		if ((liczba >> poczatek) & 1)
			cout << "1";
		else
			cout << "0";
}

int main()
{
	union
	{
		float a;
		long int b;
	};
	
	cout << "Podaj liczbe zmiennoprzecinkowa: ";
	cin >> a;
	
	cout << "Mantysa = ";
	binarnie(b, 22, 23);
	cout << endl << "Wykladnik = ";
	binarnie(b, 30, 8);
	cout << endl << "Znak = ";
	binarnie(b, 31, 1);
	cout << endl;
	
	
	return 0;
}
Nie rozumiem dlaczego do funkcji 'binarnie' przekazujemy b a wczytujemy cin-em zmienną a.
Do czego jest tu ta unia (union).

I jeszcze jedno: co robi operacja bitowa & w takim wyrażeniu:

Kod: Zaznacz cały

liczba & 1
Co to zwraca (takie wyrażenie)? Jeden wyłuskany bit? Czy liczbę zapisaną na 32 (albo 64) bitach?

czy ta operacja wygląda tak:

Kod: Zaznacz cały

     * * * *    * * * *    * * * *    * * * *    * * * *    * * * *    * * * *    * * * *        ( <-- to jest  'liczba' )
 &    0 0 0 0    0 0 0 0    0 0 0 0    0 0 0 0    0 0 0 0    0 0 0 0    0 0 0 0    0 0 0 1
czy tak:

Kod: Zaznacz cały

     * * * *    * * * *    * * * *    * * * *    * * * *    * * * *    * * * *    * * * *        ( <-- to jest  'liczba' )
 &    0 0 1 1    1 1 1 1    1 0 0 0    0 0 0 0    0 0 0 0    0 0 0 0    0 0 0 0    0 0 0 1        ( IEEE-754 )
?
Razi
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 150
Rejestracja: 20 paź 2007, 16:23
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: KDE Plasma
Kontakt:

Re: [C++] Reprezentacja liczb w reprezentacji IEEE-754

Post autor: Razi »

unia pozwala na użycie pewnego obszaru pamięci jako różne typy danych. Inaczej mówiąc: `a i `b wskazują na dokładnie ten sam obszar pamięci i bitowo zawsze a==b. Na wiki jest fajnie opisane: http://pl.wikipedia.org/wiki/Unia_%28programowanie%29
patryk007@vp.pl

Re: [C++] Reprezentacja liczb w reprezentacji IEEE-754

Post autor: patryk007@vp.pl »

No dobra ale dalej nie rozumiem czemu przekazujemy b a nie a.
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Re: [C++] Reprezentacja liczb w reprezentacji IEEE-754

Post autor: beluosus »

Bo na float nie możesz wykonywać operacji bitowych takich np. jak przesuwanie. Unię mógłbyś zastąpić wskaźnikiem czy też referencją:

Kod: Zaznacz cały

long int &b = *reinterpret_cast<long *> (&a);
Ale to wygląda mniej czytelnie.
patryk007@vp.pl

Re: [C++] Reprezentacja liczb w reprezentacji IEEE-754

Post autor: patryk007@vp.pl »

OK.
Czekam na odp. na pozostałe pytani(a/e).
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Re: [C++] Reprezentacja liczb w reprezentacji IEEE-754

Post autor: beluosus »

http://pl.wikibooks.org/wiki/C/Operatory
"liczba & 1" w uproszczeniu: sprawdza czy najmłodszy bit jest jedynką. Tak, operacja zwraca liczbę, np:

Kod: Zaznacz cały

liczba     : 10...010   // w miejsce ... jakakolwiek kombinacja 0 i 1
jeden      : 00...001   // jedynka, czyli same zera i jeden na ostatnim bicie (najmłodszym)
liczba & 1 : 00...000   // wynik działania, liczba zero, logiczny fałsz, bool: false

liczba     : 10...011
jeden      : 00...001
liczba & 1 : 00...001   // wynik działania, liczba 1, logiczna prawda, bool: true (każda niezerowa liczba jest uznawana za prawdę)
Koniunkcja 1 & 1 == 1, 1 & 0 == 0.

Dla uściślenia:

Kod: Zaznacz cały

101010...101010
^ MSB         ^ LSB
MSB - most significant bit, najbardziej znaczący bit, najstarszy
LSB - least significant bit, najmniej znaczący bit, najmłodszy
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 9 gości