[Systemy liczbowe] Zmiennoprzecinkowe kodowanie

nescafe22
Użytkownik
Użytkownik
Posty: 64
Rejestracja: 8 lut 2016, o 15:33
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 4 razy

[Systemy liczbowe] Zmiennoprzecinkowe kodowanie

Post autor: nescafe22 »

Witam zwracam się z zapytaniem jak zamienić liczbę \(\displaystyle{ -0.14}\) stosując kod zmiennoprzecinkowy używając 1 bitu znaku, 5 bitów mantysy i 4 bitów wykładnika. Czytałem trochę na ten temat i z tego co zrozumiałem na początku trzeba sobie zamienić na system dwójkowy podane wyżej liczby no i okej zamieniam i otrzymuje \(\displaystyle{ 00000.0010}\) i teraz trzeba dokonać przesunięcia w prawo aby najbardziej znacząca jedynka będzie po prawej stronie przecinka. no to będzie to wyglądało w ten sposób trzeba dokonać przesunięcia o dwa bity i otrzymam \(\displaystyle{ 00000.1000}\) Tylko to potem nie zgadza się z odpowiedzią która wynosi \(\displaystyle{ 1 00011 0110}\) Dlaczego w mantysie są aż dwie jedynki a nie tylko jedna ?
Ostatnio zmieniony 26 cze 2016, o 19:59 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
SlotaWoj
Użytkownik
Użytkownik
Posty: 4211
Rejestracja: 25 maja 2012, o 21:33
Płeć: Mężczyzna
Lokalizacja: Kraków PL
Podziękował: 2 razy
Pomógł: 758 razy

[Systemy liczbowe] Zmiennoprzecinkowe kodowanie

Post autor: SlotaWoj »

nescafe22 pisze:... i otrzymuje \(\displaystyle{ 00000.0010}\)
Jak to ma się do danej wejściowej \(\displaystyle{ -0,14_{10}}\) ?
Co i w którą stronę chcesz przesuwać?
nescafe22
Użytkownik
Użytkownik
Posty: 64
Rejestracja: 8 lut 2016, o 15:33
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 4 razy

[Systemy liczbowe] Zmiennoprzecinkowe kodowanie

Post autor: nescafe22 »

SlotaWoj pisze:
nescafe22 pisze:... i otrzymuje \(\displaystyle{ 00000.0010}\)
Jak to ma się do danej wejściowej \(\displaystyle{ -0,14_{10}}\) ?
Co i w którą stronę chcesz przesuwać?
no w lewą stronę będę przesuwał postać wykładniczą czyli \(\displaystyle{ 0010}\)..
SlotaWoj
Użytkownik
Użytkownik
Posty: 4211
Rejestracja: 25 maja 2012, o 21:33
Płeć: Mężczyzna
Lokalizacja: Kraków PL
Podziękował: 2 razy
Pomógł: 758 razy

[Systemy liczbowe] Zmiennoprzecinkowe kodowanie

Post autor: SlotaWoj »

Liczba ma być zapisana w 10-bitowym formacie zmiennoprzecinkowym: s mmmmm cccc gdzie:
s – bit znaku,
mmmmm – bity mantysy bez najbardziej znaczącego (jest zawsze równy 1 i jest pomijany),
cccc – bity wykładnika.

Do rozwiązania zadania potrzebna jest jeszcze informacja, jakie ograniczenia ma spełniać mantysa, bo może być: \(\displaystyle{ 1/2\le m < 1}\) albo \(\displaystyle{ 1\le m < 2}\) oraz jak mają być kodowane wykładniki, bo może być: \(\displaystyle{ w=c-7}\) (analogia do typu single), \(\displaystyle{ w=c-8}\) (kontranalogia do typu single) albo \(\displaystyle{ w=c-9}\) (analogia do typu real48).
Należy zaznaczyć, że ww. warunki (na mantysę i cechę) są częściowo ze sobą związane.

Z podanej w odpowiedzi binarnej zmiennoprzecinkowej reprezentacji \(\displaystyle{ 1\,00011\,0110}\) liczby \(\displaystyle{ -0,14_{10}}\) wynika, że \(\displaystyle{ \text{cccc}=6_{10}=0110_2}\) i albo:
  • \(\displaystyle{ 1\le m < 2}\) i wówczas \(\displaystyle{ 0,14_{10}=1+\text{mmmmm}\cdot2^{c-9}=1,09375\cdot2^{c-9}}\)
albo:
  • \(\displaystyle{ 0,5\le m < 1}\) i wówczas \(\displaystyle{ 0,14_{10}=0,5+\text{mmmmm}=0,546875\cdot2^{c-8}}\)
Żaden z ww. sposobów kodowania nie jest (przez analogię) zgodny ani z historycznie pierwotnym real48, ani ze znormalizowanym i zalecanym standardem IEEE-754.

Uzupełniając temat zadania o niezbędne warunki analogiczne do IEEE-754, tzn: \(\displaystyle{ 1\le m < 2}\) i \(\displaystyle{ w=c-7}\) dla liczby \(\displaystyle{ -0,14_{10}}\) znajdujemy binarną zmiennoprzecinkową w sposób następujący:
  1. Ponieważ liczba jest ujemna to \(\displaystyle{ \text{s}=1}\) i zmieniamy znak liczby na przeciwny.
  2. Przekształcamy liczbę do postaci, w której mantysa spełnia ww. warunek tzn. \(\displaystyle{ 0,14_{10}=1,12_{10}\cdot2^{-3}}\) i mamy wykładnik \(\displaystyle{ w=-3}\) .
  3. Wykonujemy operację \(\displaystyle{ 0,12_{10}=1,12_{10}-1_{10}}\) (jest to równoznaczne z pominięciem najbardziej znaczącego bitu mantysy, który zawsze jest równy 1).
  4. Dla \(\displaystyle{ i=1,\,2,\,3,\,...,\,5}\) kolejno sprawdzamy czy od liczby \(\displaystyle{ 0,12_{10}}\) lub następnych różnic (reszt) można odjąć \(\displaystyle{ 2^{-i}}\) i jeśli:
    1. TAK, to do kolejnego (od najbardziej znaczącego = lewego) bitu mantysy wpisujemy \(\displaystyle{ 1}\) i wykonujemy odejmowanie otrzymując kolejną różnicę,
    2. NIE (można odjąć, tzn, różnica będzie ujemna) to do kolejnego bitu mantysy wpisujemy \(\displaystyle{ 0}\) i odejmowania nie wykonujemy.
  5. Mantysa jest 5-cio bitowa, więc jeżeli od ostatniej różnicy można odjąć \(\displaystyle{ 2^{-6}}\), to należy wykonać zaokrąglenie, tzn. dodać \(\displaystyle{ 1}\) do najmniej znaczącego bitu mantysy.
    Przy kodowaniu binarnym liczby \(\displaystyle{ 0,12_{10}=000111_{1/2}}\) trzeba wykonać zaokrąglenie i \(\displaystyle{ \text{mmmmm}=00011_{1/2}+00001_{1/2}=00100}\) .
  6. Jeżeli w wyniku zaokrąglania mantysa ulegnie przepełnieniu, to tak jakbyśmy mieli do czynienia z zapisem dziesiętnym \(\displaystyle{ 1,999(9)_{10}=2,000(0)_{10}}\) i wówczas zmniejszamy o \(\displaystyle{ 1}\) wykładnik, a bity mantysy będą reprezentowane jako \(\displaystyle{ \text{mmmmm}=00000}\) .
    Przy kodowaniu binarnym liczby \(\displaystyle{ 0,12_{10}=000111_{1/2}}\) przepełnienie nie występuje.
  7. Jako binarną reprezentację cechy \(\displaystyle{ \text{cccc}}\) wpisujemy wartość \(\displaystyle{ w+7}\) .
    Dla liczby \(\displaystyle{ 0,14_{10}}\) będzie \(\displaystyle{ \text{cccc}=-3+7=4_{10}=0100_2}\) .
Ostatecznie binarna zmiennoprzecinkowa reprezentacja liczby \(\displaystyle{ -0,14_{10}}\) postaci \(\displaystyle{ \text{s\,mmmmm\,cccc}}\) spełniająca przyjęte warunki będzie następująca:
  • \(\displaystyle{ 1\,00100\,0100}\)
Z podanej w odpowiedzi binarnej zmiennoprzecinkowej reprezentacji \(\displaystyle{ 1\,00011\,0110}\) liczby \(\displaystyle{ -0,14_{10}}\) wynika, że nie zostało, a powinno być być przeprowadzone zaokrąglanie. Cecha podana w tej reprezentacji jest różna od ww. ze względu inne założenia kodowania (na pewno nie analogiczne do IEEE-754).

Edit: Doprecyzowałem punkt: NIE (można odjąć, tzn. ...)
nescafe22
Użytkownik
Użytkownik
Posty: 64
Rejestracja: 8 lut 2016, o 15:33
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 4 razy

[Systemy liczbowe] Zmiennoprzecinkowe kodowanie

Post autor: nescafe22 »

SlotaWoj pisze: Z podanej w odpowiedzi binarnej zmiennoprzecinkowej reprezentacji \(\displaystyle{ 1\,00011\,0110}\) liczby \(\displaystyle{ -0,14_{10}}\) wynika, że nie zostało, a powinno być być przeprowadzone zaokrąglanie. Cecha podana w tej reprezentacji jest różna od ww. ze względu inne założenia kodowania (na pewno nie analogiczne do IEEE-754).

Edit: Doprecyzowałem punkt: NIE (można odjąć, tzn. ...)
A mógłbyś mi dokładnie wytłumaczyć zaokrąglanie ?
SlotaWoj
Użytkownik
Użytkownik
Posty: 4211
Rejestracja: 25 maja 2012, o 21:33
Płeć: Mężczyzna
Lokalizacja: Kraków PL
Podziękował: 2 razy
Pomógł: 758 razy

[Systemy liczbowe] Zmiennoprzecinkowe kodowanie

Post autor: SlotaWoj »

Jeżeli kolejny nie objęty (za) mantysą bit jest równy 1, dodajemy do mantysy bit na najmniej znaczącej pozycji. Gdy dodawanie skutkuje przepełnieniem mantysy, zmniejszamy wykładnik o 1.
ODPOWIEDZ