Podręcznik
4. Procesor – informacje ogólne
4.11. Typy zmiennoprzecinkowe
Drugim podstawowym typem danych są liczby zmiennoprzecinkowe (rzeczywiste). Liczby takie są przetwarzane przez specjalizowaną jednostkę FPU procesora. Jednostka FPU może też pracować z całkowitoliczbowymi typami danych ze znakiem, bez znaku i spakowanymi liczbami BCD. Typy danych akceptowane przez jednostkę FPU są przedstawione na rysunku 17.
Rys. 17. Typy danych, akceptowalne przez jednostkę FPU [źródło: Intel® 64 and IA-32 Architectures
Software Developer’s Manual, Volume 1: Basic Architecture, January 2013]
Liczby zmiennopozycyjne również są przechowywane w postaci binarnej. Ponieważ typ liczby zmiennoprzecinkowej jest bardziej skomplikowany poniżej zostanie przedstawiony przykład ilustrujący strukturę takiej liczby. Liczba zmiennopozycyjna jest przechowywana w postaci naukowej binarnej (cecha z przesunięciem).
Rys. 18. Binarny format liczby zmiennopozycyjnej
Liczby zmiennopozycyjne mogą być 80, 64, 32 bitowe. Dla uproszczenia przykład zostanie podany dla liczby 32 bitowej. Załóżmy, że chcemy przedstawić liczbę dziesiętną 178.125 w notacji binarnej liczby zmiennopozycyjnej o długości 32 bitów. Liczba taka składa się z mantysy (23 bity), czyli części znaczącej liczby, i cechy, czyli potęgi liczby 2 (8 bitów) oraz znaku (1 bit) (Rys.18). Najpierw liczbę 178.125 przedstawiamy w postaci naukowej 1.78125*10^2. Proszę zwrócić uwagę, że znak kropki powinien być po pierwszej cyfrze. Odpowiednie liczby w systemie dwójkowym przyjmą postać: 10110010.001 = 1.0110010001*2^111. W tym przypadku kropka występuje zawsze po cyfrze 1, w związku z tym nie musimy przechowywać pierwszej cyfry 1. Kropka została przesunięta o 7 pozycji, stąd cecha równa 111 (7 dziesiętnie). Generalnie kropkę możemy przesuwać w lewo lub w prawo. Cecha może być zatem również liczbą ujemną. W formacie cechy nie ma jednak miejsca na znak. Zamiast tego cecha jest przesunięta o 0111 111b (127), czyli ta liczba jest do niej dodawana. Cecha z zakresu (- 127 +127) będzie w ten sposób zawsze dodatnia. Po przesunięciu cechy mamy 0111 1111 + 0000 0111 = 1000 0110. Następnie tworzymy liczbę zmiennopozycyjną. Znak jest 0, następne 8 bitów to przesunięta cecha 1000 0110, kolejne 23 bity to mantysa z pominięciem jedynki przed kropką i samej kropki. Wpisujemy 23 bity, jeśli brakuje cyfr uzupełniamy je zerami. Kolejne etapy tworzenia liczby zmiennopozycyjnej są przedstawione w Tabeli 2. Oczywiście wszelkie operacje arytmetyczne i logiczne przeprowadzane na tak zapisanych liczbach są dość skomplikowane.
Tabela 2. Przykład zapisu liczby w binarnym formacie zmiennopozycyjnym
Notacja |
Wartość |
||
Zwykła |
178.125 |
10110010.001 |
|
Naukowa |
1.78125E102 |
1.0110010001E2111 |
|
Naukowa Binarna (cecha z przesunięciem) |
1.0110010001E210000110 bo 127d = 0111 1111b 0111 1111 + 0000 0111 = 1000 0110 |
||
Single-Real |
Znak 0 1bit |
Cecha (przesunięta) 10000110 8 bitów |
Mantysa (znormalizowana) 01100100010000000000000 uzupełniamy zerami do 23 bitów |
Liczby zapisane w wyżej opisanym formacie to tzw. liczby znormalizowane. Oprócz takich liczb FPU może używać liczb zdenormalizowanych. Są to liczby bardzo małe (bliskie zeru), dla których przesunięcie przecinka jest na tyle duże, że nie mieści się w zakresie cechy – (-127, +127) dla powyższego przykładu. Taką liczbę można przedstawić z mniejszą dokładnością zakładając, że przed kropką jest zero (Rys. 19). Dokładność liczby jest większa niż proste przybliżenie jej zerem. Proszę zauważyć, że w notacji liczby zmiennopozycyjnej występują dwa zera (ze znakiem plus i minus) oraz dwie nieskończoności, również z dwoma znakami. Nieskończoność w tym przypadku oznacza największą i najmniejszą liczbę jaką można reprezentować w systemie. Symbol NaN oznacza nie liczbę (ang. not a numer) i jest używany do przedstawienia różnych sytuacji wyjątkowych, np. dzielenia przez zero.
Rys. 19. Reprezentacja liczb rzeczywistych w jednostce FPU [źródło: Intel® 64 and IA-32 Architectures
Software Developer’s Manual, Combined Volumes: 1, 2A, 2B, 2C, 3A, 3B and 3C, January 2013]