Jason. Cała informatyka w jednym miejscu!

Na dzisiaj przygotowałem jeden z tematów pobocznych, które każdy z Was może opanować wedle własnego uznania. Nie jest to ani często widziane, ani szeroko wykorzystywane. Temat ten dotyczy szesnastkowego systemu liczbowego, a posługując się eleganckim słownikiem mogliście zetknąć się z terminem "heksadecymalny literał zmiennoprzecinkowy" (ang. "hex float literal"). Jest to rzadki okaz, praktycznie już w ogóle niestosowany, aczkolwiek ze względów historycznych chciałem przybliżyć Wam ten wątek. Na końcu artykułu pokażę Wam jak zamienić coś takiego na liczbę w systemie dziesiętnym.

CZYM JEST HEKSADECYMALNY LITERAŁ ZMIENNOPRZECINKOWY?

Pisząc najbardziej łopatologicznie jest to zwykła liczba zmiennoprzecinkowa sformatowana według notacji naukowej, ale w systemie szesnastkowym (heksadecymalnym). Spotykając się z takim lub podobnym zapisem:

0x75.3p5

mogliście mocno łapać się za głowę jak to rozbroić. Sam miałem z tym nie lada kłopot, ale postanowiłem to sobie przećwiczyć przez kilka dni i udało mi się. Wystarczy znać odpowiednie czynności do wykonania i bardzo uważać na ułamki. Jeżeli poddacie się po czasie, nic nie szkodzi. Jak napisałem, jest to bardzo rzadko spotykany zapis i w dzisiejszych czasach raczej nikt nie będzie sobie utrudniał zrozumienia kodu.

Heksadecymalny literał zmiennoprzecinkowy

Heksadecymalny literał zmiennoprzecinkowy to w rzeczywistości liczba zmiennoprzecinkowa w formacie szesnastkowym. Jest dzisiaj bardzo rzadko używana (jeśli nie wcale).

METODA ROZWIĄZYWANIA

Sprawa jest prosta. Weźmy pod lupę jeszcze raz tę samą liczbę:

0x75.3p5

Przedrostek "0x" ma służyć oznaczeniu reprezentacji liczby w systemie szesnastkowym. Idąc dalej mamy cyfrę 7. Jest ona drugą cyfrą stojącą przed kropką (format amerykański nakazuje, aby stosować kropkę zamiast przecinka, tak jak ma to u nas miejsce). Oznacza to, że musimy ją pomnożyć przez 16 podniesione do potęgi 1 (7*161). Potem mamy piątkę. Ona również stoi przed częścią ułamkową, zatem mamy 5*(160) (każde wyrażenie podniesione do potęgi zero daje 1), czyli wychodzi 5.

Pomijamy kropkę i od tego momentu robi się ciekawie. Trójka stoi po kropce jako pierwsza, dlatego też występuje ułamek w postaci 3/(161), a zaraz po niej mamy literę "p". Jest to oznaczenie notacji naukowej tak samo, jak w zwykłej liczbie macie literę "e". Tylko, że zamiast podstawy 10 macie dwójkę. Stąd wynika, że wszystkie dotychczasowe składniki chwytacie w nawias, sumujecie je i całą sumę mnożycie przez dwa do potęgi piątej.

Tak się rozwiązuje heksadecymalny literał zmiennoprzecinkowy. Potem wystarczy ostrożnie sprowadzać do wspólnego mianownika, poskracać wszystko co się da i zsumować. Można również sprowadzić wszystkie składniki do tej samej podstawy zamieniając na mnożenie przez 2 do potęgi n, a później dodawać i usuwać od siebie wykładniki potęgi. Oto dwa prawidłowe zapisy dotychczasowych wyjaśnień:

SUMOWANIE POTĘGI
0x75.3p5 = 0x75.3p5 =
(7*(161) + 5*160 + 3/(161))*25 = (7*24 + 5 + 3*(2-4))*25 =
(7*16 + 5 + 3/16)*32 = 7*24*25 + 5*25 + 3*(2-4)*25 =
(7*16 + 80/16 + 3/16)*32 = 7*29 + 5*25 + 3*2 =
(112 + 83/16)*32 = 3584 + 160 + 6 =
(1792/16 + 83/16)*32 = 3750
(1875/16)*32 =
1875*2 =
3750

Dodam, że ten zapis obsługuje język C, C++ oraz Java. Być może jeszcze jakiś by się trafił, ale za dużo ich nie znajdziecie bo ten zapis nie jest już w ogóle stosowany w 99% przypadków. Teraz możemy to postrzegać jako element historii rozwoju języków wysokiego poziomu.

SPRAWDŹ CZY ROZUMIESZ JUŻ HEKSADECYMALNY LITERAŁ ZMIENNOPRZECINKOWY!

Na zakończenie zostawię parę przykładów dla samodzielnego policzenia, abyście mogli sami spróbować swoich sił:

0x7.1p5

0x26.bp10

0x15b.acp8

Szesnastkowe literały mogą zawierać litery zamiast cyfr! Obowiązuje ta sama zasada konwertowania na liczbę jak w całym systemie szesnastkowym (od litery A do F są to liczby od 10 do 15).


Wszystko na ten temat. Dla dociekliwych, odpowiedzi na powyższe przykłady to: 226, 39916 oraz 89004.

PODOBNE ARTYKUŁY