Materiał na jaki patrzysz stanowi bardziej ciekawostkę, niż wiedzę jaką warto przyswoić, natomiast jeżeli interesują Cię bardzo rzadko spotykane konstrukcje w programowaniu, to jedną z nich jest niejaki heksadecymalny literał zmiennoprzecinkowy 😮! Dowiesz się co to takiego, jaką przyjmuje postać i jak zamienić taką wartość na system dziesiętny. Zapraszam 😊!

ZOBACZ JAK WYGLĄDA HEKSADECYMALNY LITERAŁ ZMIENNOPRZECINKOWY!

Wyjaśnijmy sobie w pierwszej kolejności sam termin, potem przejdziemy do zapoznania się z samym zapisem w kodzie źródłowym, a na końcu opiszę krok po kroku sposób zamiany wartości na system dziesiętny 👍.

CZYM JEST HEKSADECYMALNY LITERAŁ ZMIENNOPRZECINKOWY W PROGRAMOWANIU?

W programowaniu jest to liczba zmiennoprzecinkowa sformatowana według notacji naukowej, lecz w systemie szesnastkowym (heksadecymalnym) 🔥. Stosuje się ją w celu zabezpieczenia przed utratą wartości ułamkowej spowodowanej ograniczoną liczbą bitów (określa się to "precyzją") 💡. Obecnie bardzo rzadko stosowana (jeśli w ogóle), stąd przybliżam ten wątek głównie jako ciekawostkę, że coś takiego istnieje 🙂. Temat związany z szesnastkowym systemem liczbowym, więc proponowałbym dobrze go opanować, zanim spróbujesz zrozumieć co tu się wyprawia 😁.

Heksadecymalny literał zmiennoprzecinkowy ("hex float literal") wyróżnia się nietypowym sposobem zapisu wynikającym z połączenia zapisu przedrostka charakterystycznego dla systemu szesnastkowego ("0x") i notacji naukowej (litera 'p'). To jest przykład wartości zapisanej w takim formacie 👇:

0x75.3p5

Może wyglądać przerażająco na pierwszy rzut oka, natomiast wystarczy poznać technikę i nauczyć się wykonywać odpowiednie kroki uważając na ułamki 🙂.

Heksadecymalny literał zmiennoprzecinkowy w programowaniu

Heksadecymalny literał zmiennoprzecinkowy to nic innego, jak liczba zmiennoprzecinkowa w systemie szesnastkowym połączona z notacją naukową.

Zobaczmy jak interpretować tę postać 🔍!

JAK ROZUMIEĆ HEKSADECYMALNY LITERAŁ ZMIENNOPRZECINKOWY W PROGRAMOWANIU?

Analizę zapisu heksadecymalnego literału zmiennoprzecinkowego będę tłumaczył na takim przykładzie 👇:

0x75.3p5

Zacznijmy od lewej strony 🙂. "0x" to jest przedrostek oznaczający, że dana liczba jest zapisana w systemie szesnastkowym. Jest to najbardziej zakorzeniony zapis wśród wielu języków programowania i taki "znak rozpoznawczy" liczb z tego systemu liczbowego. W dalszej części mamy cyfry i tu zwracam szczególną uwagę, że nie wolno patrzeć na nie, jak na co dzień 🚫!

Widzimy 75, lecz należy to interpretować jak dwie osobne cyfry 7 i 5 👀! Każda z nich jest odrębnym składnikiem sumy przemnożonej przez odpowiednią potęgę liczby 16, jeśli byśmy chcieli zamienić sobie na system dziesiętny 💥. Kropka między nimi oznacza zakończenie części dziesiętnej i rozpoczęcie części ułamkowej, co również ma wpływ na cały wynik. My Polacy, mamy od tego przecinek. Amerykanie i programowanie, które jest dostosowane pod ich notację, korzystają z kropki 🙂.

Na samym końcu mamy literę 'p' i to oznacza początek formatu według notacji naukowej, tylko dostosowanej pod system szesnastkowy - dlatego jest mała litera 'p', a nie 'e', jaką się widzi najczęściej ✅. Cyfra "stojąca" tuż za nią oznacza wykładnik potęgi liczby 2 i uwaga, w systemie dziesiętnym 😮! To jest jedyny wyjątek ze wszystkich cyfr, które dotyczą systemu szesnastkowego 🚨. Może się zdarzyć notacja naukowa zawierająca wykładnik ujemny i wtedy pomiędzy literą 'p', a cyfrą, będzie znajdować się minus ➖.

Tak należy interpretować heksadecymalny literał zmiennoprzecinkowy i to jest ważne, abyśmy mieli pewność, że potrafimy sobie przetłumaczyć ten zapis, ponieważ inaczej nie będziemy w stanie przekonwertować sobie tej liczby na system dziesiętny i teraz czas na ukazanie jak się to robi 🚀!

JAK ZAMIENIĆ HEKSADECYMALNY LITERAŁ ZMIENNOPRZECINKOWY NA SYSTEM DZIESIĘTNY?

Zaprezentuję całą metodę konwersji na tej samej przykładowej liczbie 👇:

0x75.3p5

Najlepiej zacząć od zapisania liczby potęgowanej wynikającej z notacji naukowej, ponieważ będzie wpływać na całą sumę pozostałych składników 👍. Mamy cyfrę 5, co oznacza że wykładnik potęgi przyjmie wartość 5. Pamiętamy, że ta część wyjątkowo jest zapisana w systemie dziesiętnym a nie w szesnastkowym, zatem ostatecznie otrzymamy piątą potęgę liczby 2 👇:

25

Ta wartość będzie mnożona przez każde wyrażenie pochodzące od wszystkich cyfr z osobna. Teraz możemy się zająć resztą cyfr poczynając od lewej strony ⬅️. One już są zapisane w systemie szesnastkowym, więc wszystkie zostaną przemnożone przez odpowiednią potęgę liczby 16 🔥. Potęga liczby 16 danej cyfry zależy od tego, jak bardzo jest ona "odsunięta" od kropki oddzielającej część dziesiętną od ułamkowej 💡. Ona będzie naszym "punktem orientacyjnym" 🎯. Oprócz tego trzeba patrzeć po której stronie się znajdujemy, gdyż po lewej stronie potęgi są "liczone" od zera, zaś po prawej, "liczone" od jedynki ⚠️! Wszystko się wyjaśni w dalszej części 😉.

Wartość 7 jest drugą od prawej strony od kropki, zatem wykładnik potęgi liczby 16 będzie równy 1 🌟. Piszemy takie wyrażenie 👇:

7*161

To jest ta sama wartość 7 po przekonwertowaniu na system dziesiętny 😲! Przechodzimy do kolejnej cyfry, którą jest 5. Ona znajduje się w bezpośrednim sąsiedztwie z kropką, więc wykładnikiem potęgi liczby 16 będzie 0 (zero)! Zatem otrzymamy takie wyrażenie 👇:

5*160

Taka sytuacja jest najprzyjemniejsza dla nas bowiem każde wyrażenie podniesione do potęgi zerowej daje liczbę 1 😉.

Mamy zbadane wszystkie cyfry po lewej stronie, więc możemy przejść do prawej ➡️! Część dotycząca notacji naukowej już została przekonwertowana na samym początku, więc została cyfra 3. W tym przypadku mamy inną sytuację 🔥! Po pierwsze, wykładnikiem potęgi będzie tym razem wartość 1 (a nie zero!), a po drugie przyjmuje wartość przeciwną, czyli ostatecznie będziemy mieli takie wyrażenie 👇:

3*16(-1)

To wszystkie cyfry jakie trzeba było uwzględnić ✅. Gdy zbierzemy sobie te wyrażenia w jedną całość, otrzymujemy następującą postać 👇:

25*(7*161 + 5*160 + 3*16(-1))

Teraz widzisz dlaczego dobrze jest zacząć od notacji naukowej 😊. Do zamiany na system dziesiętny pozostało tylko policzenie tego wyrażenia ❤️. Można wszystko wymnożyć i wtedy zsumować, lecz nieco łagodniejszym podejściem będzie najpierw zamienić podstawy 16 na 2 do potęgi 4, następnie przemnożyć wszystkie składniki przez wyrażenie będące przed nawiasem (2 do potęgi 5 w tym przypadku), aż wreszcie "scalić" ze sobą oba wyrażenia z tą samą podstawą odpowiednio dodając/odejmując potęgi i w ten sposób efektywnie skrócić te wyrażenia, bo będą wychodzić naprawdę duże liczby 😅.

Jeżeli potrzebujesz "przełożenia" tej metody na zapis matematyczny, to będzie to wyglądać tak 👇:

7*24*25 + 5*1*25 + 3*2(-4)*25

Przypomnę, że jeżeli mamy te same podstawy, to możemy połączyć dwa takie same wyrażenia dodając do siebie wykładniki potęg 👍. Po zsumowaniu wszystkich wyrażeń, otrzymamy liczbę 3750 i to będzie wartość tego literału w systemie dziesiętnym 🎯. Tak wygląda cała metoda ☑️.

PRZYKŁADOWE ĆWICZENIA ZAMIANY HEKSADECYMALNEGO LITERAŁU ZMIENNOPRZECINKOWEGO NA SYSTEM DZIESIĘTNY

Gdybyś chciał(a) sobie poćwiczyć, zostawiam trzy przykłady do samodzielnego policzenia 👇:

  • 0x7.1p5,
  • 0x26.bp10,
  • 0x15b.acp8.

Zauważ, że w niektórych miejscach występuje litera, zamiast cyfry 👀! W systemie szesnastkowym obowiązuje taka reguła, że jeżeli dana wartość ma być większa od 9 (bo to największa cyfra), to reprezentuje literę alfabetu od A do F, aż do uzupełnienia do piętnastu 💡. Czyli pod literą A będzie kryć się liczba 10, a pod literą F, liczba 15. Wtedy wystarczy sobie po prostu zamienić daną literę na liczbę i podstawić do wyrażenia 😉.

Rozwiązania do powyższych do przykładów są następujące (podane w tej samej kolejności) 👇:

  • 226,
  • 39616,
  • 89004.

Ostatni rozdział na temat prezentacji takiego literału w kodzie i kończymy z tym 😄!

PRZYKŁAD UŻYCIA HEKSADECYMALNEGO LITERAŁU ZMIENNOPRZECINKOWEGO W PROGRAMOWANIU

Chcąc umieścić taki literał w kodzie źródłowym, wystarczy utworzyć sobie zmienną typu "double" (liczba zmiennoprzecinkowa o podwójnej precyzji) i napisać dokładnie w takiej postaci jaką już ujrzałeś(-aś) na samym początku. To jest przykład użycia w języku C, który obsługuje heksadecymalny literał zmiennoprzecinkowy 👇:

double hexFloatLiteral = 0x75.3p5;

Gdy wprowadzisz ją do wywołania funkcji "prinf" 👇:

printf("%f\n", hexFloatLiteral);

to po uruchomieniu programu zobaczysz wynik w systemie dziesiętnym - taki sam, jaki został policzony u góry ✔️.

Nie wszystkie języki wysokiego poziomu będą wspierały taki zapis ⚠️. Do sprawdzonych przeze mnie zaliczają się C, C++ i Java ℹ️.


Wszystko na ten temat 😊. W praktyce zawodowej prawdopodobnie nie będziesz miał(a) potrzeby skorzystania z tego kiedykolwiek, natomiast fajnie wiedzieć, że istnieje coś takiego 😎.

PODOBNE ARTYKUŁY