Największa liczba zmiennoprzecinkowa przy danych ograniczeniach

0

Mam test wielokrotnego wyboru do poćwiczenia liczb zmiennoprzecinkowych.
Ograniczenia są takie: liczba zmiennoprzecinkowa jest 8 bitowa. 1 bit na znak, 3 bity na cechę, 4 bity na mantysę. Cecha jest zapisana z nadmiarem 4.

Pytanie jest takie: Jaka jest największa liczba w tej reprezentacji (dziesiętnie)?
Prawidłowa odpowiedź według quizu jest to 7.75. Natomiast zupełnie nie rozumiem dlaczego ta odpowiedź jest prawidłowa. Oto moje rozwiązanie zadania:

Największa wartość tej liczby zmiennoprzecinkowej jest wtedy gdy bit znaku jest 0, cecha jest największa i mantysa jest największa.

  1. Największa cecha -> 111 zapisana z nadmiarem 4, więc cecha jest równa 7 - 4 = 3.
  2. Największa mantysa -> 1111. Wiadomo, że w pamięci jest zapisana tylko część ułamkowa liczby, a mantysa jest znormalizowana.
    Niech w będzie szukaną wartością. Wtedy:
    w = 01,1111 * 2^3 = 01111,1 = 15.5

Jak widać wynik wyszedł mi niezgodny z odpowiedzią. Czy ktoś byłby w stanie mi wytłumaczyć gdzie popełniam błąd?

0

ale to 1,1111 to jest 5 bitów a nie 4 - powinieneś mieć 0,1111

0

W takim razie niezbyt to rozumiem. Mamy w pamięci w miejscu mantysy 1111. Wiadomo, że mantysa jest znormalizowana, czyli trzeba byłoby ją zapisać jako 1,1111, bo jeszcze bit znaku. No i właśnie mamy przepełnienie, bo jest tutaj 5 bitów. Z tym, że jak zapiszę wartość mantysy jako 0,1111 to ta mantysa już nie jest znormalizowana. To jak to znormalizowanie w końcu działa? Musi być czy nie musi?

0

Tu jest kolejny przykład:
Bit znaku: 1
Cecha: 3
Mantysa: 4 bity

Bajt zawiera ciąg bitów: 01101011
Bit znaku: 0
Cecha: 110 -> 6 - 4 = 2
Mantysa: 1011 -> 1,1011 - dlaczego tutaj mogę przyjąć mantysę jako znormalizowaną, a wcześniej tak nie mogłem zrobić?

1

Skąd wiesz ze quiz nie jest błędny? ;)

0

Raczej nie jest błędny. Właśnie znalazłem, że mantysę przykładowo taką: 1111 nie powinno się normalizować do postaci 1,1111 tylko 0,11111. A dlaczego tak jest to dla mnie pozostaje zagadką. Myślałem, że mantysa znormalizowana to taka, której wartość zawiera się w przedziale [1, B) gdzie B to podstawa systemu liczbowego... Byłby ktoś w stanie mi wytłumaczyć dlaczego ta normalizacja 1,1111 jest błędna?

5

Jak na moje, to dobrze Ci wyszło, pod warunkiem że to kodowanie nie uwzględnia +/- inf oraz NaN.

Mantysa jest znormalizowana tzn. 1 <= x < 2. Jeśli dobrze pamiętam, to w IEEE754 jedynka jest pominięta, bo i tak zawsze wynosiłaby 1. Jeśli przyjąć w ten sposób, to faktycznie wyjdzie tak jak podałeś.

W sumie przetestujmy inne możliwości:

  • brak normalizacji: 1,111 * 2^3 = 1111,0 = 15 - nie pasuje
  • normalizacja, ale do 0 <= x < 1: 0,1111 * 2^3 = 111,1 = 7,5 - znów nie pasuje
  • normalizacja jak na początku, ale dodatkowo kodujemy +/- inf oraz NaN, które w IEEE754 mają ustawione wszystkie bity cechy (111). Wtedy największa możliwa "zwyczajna" cecha to 2, a nie 3 i mamy: 1,1111 * 2^2 = 111,11 = 7,75 czyli zgodnie z oczekiwaną odpowiedzią :]

IMO zadanie zakłada kodowanie jak w IEEE754, czyli normalizacja 1 <= x < 2, pominięcie wiodącej jedynki + największa wartość cechy koduje +/- inf i NaN :)

0

No tak... Pominąłem sobie wiodącą jedynkę, ale już nie popatrzyłem na to, że największa wartość cechy koduje +/- inf i NaN. Dzięki! Już myślałem, że mnie szlag przy tym trafi... :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1