Szesnastkowy zmiennoprzecinkowy IBM

Szesnastkowy zmiennoprzecinkowy (obecnie nazywany HFP przez IBM ) to format kodowania liczb zmiennoprzecinkowych wprowadzony po raz pierwszy na komputerach IBM System / 360 i obsługiwany na kolejnych maszynach opartych na tej architekturze, a także na maszynach, które miały być aplikacjami kompatybilny z Systemem/360.

W porównaniu do formatu zmiennoprzecinkowego IEEE 754 , format HFP ma dłuższą mantysę i krótszy wykładnik . Wszystkie formaty HFP mają 7 bitów wykładnika z odchyleniem 64. Znormalizowany zakres reprezentowalnych liczb wynosi od 16-65 do 16 63 (około 5,39761 × 10-79 do 7,237005 × 1075 ) .

Liczba jest reprezentowana przez następującą formułę: (−1) znak × 0. znaczna × 16 wykładnik −64 .

32-bitowy o pojedynczej precyzji

Numer HFP o pojedynczej precyzji (nazywany przez IBM „krótkim”) jest przechowywany w 32-bitowym słowie:

1 7 24 (szerokość w bitach)
S Do potęgi Frakcja  
31 30 ... 24 23 ... 0 (indeks bitów) *
* Dokumentacja IBM numeruje bity od lewej do prawej, tak że najbardziej znaczący bit jest oznaczony jako bit numer 0.

W tym formacie początkowy bit nie jest pomijany, a punkt podstawy (szesnastkowy) jest ustawiany na lewo od mantysy (ułamek w dokumentacji IBM i na rysunkach).

Ponieważ podstawa wynosi 16, wykładnik w tej postaci jest około dwa razy większy niż odpowiednik w IEEE 754, aby mieć podobny zakres wykładników w systemie binarnym, potrzebnych byłoby 9 bitów wykładników.

Przykład

Rozważ zakodowanie wartości −118,625 jako wartości zmiennoprzecinkowej HFP o pojedynczej precyzji.

Wartość jest ujemna, więc bit znaku wynosi 1.

Wartość 118,625 10 w systemie binarnym to 1110110,101 2 . Ta wartość jest normalizowana przez przesunięcie punktu podstawy w lewo o cztery bity (jedna cyfra szesnastkowa) na raz, aż skrajna lewa cyfra będzie równa zero, co daje 0,01110110101 2 . Pozostałe skrajne prawe cyfry są wypełnione zerami, co daje 24-bitowy ułamek .0111 0110 1010 0000 0000 0000 2 .

Znormalizowana wartość przesunęła punkt podstawy o dwie cyfry szesnastkowe w lewo, dając mnożnik i wykładnik równy 16 +2 . Do wykładnika (+2) dodaje się odchylenie +64, co daje +66, czyli 100 0010 2 .

Połączenie znaku, wykładnika plus odchylenie i ułamka znormalizowanego daje następujące kodowanie:

S Do potęgi Frakcja  
1 100 0010 0111 0110 1010 0000 0000 0000  

Innymi słowy, reprezentowana liczba to −0,76A000 16 × 16 66 − 64 = −0,4633789… × 16 +2 = −118,625

Największa reprezentatywna liczba

S Do potęgi Frakcja  
0 111 1111 1111 1111 1111 1111 1111 1111  

Przedstawiona liczba to +0.FFFFFF 16 × 16 127 − 64 = (1 − 16 −6 ) × 16 63 ≈ +7,2370051 × 10 75

Najmniejsza dodatnia liczba znormalizowana

S Do potęgi Frakcja  
0 000 0000 0001 0000 0000 0000 0000 0000  

Przedstawiona liczba to +0,1 16 × 16 0 − 64 = 16 −1 × 16 −64 ≈ +5,397605 × 10 −79 .

Zero

S Do potęgi Frakcja  
0 000 0000 0000 0000 0000 0000 0000 0000  

Zero (0,0) jest reprezentowane w znormalizowanej postaci jako wszystkie bity zerowe, co jest arytmetyczną wartością +0,0 16 × 16 0 − 64 = +0 × 16 −64 ≈ +0,000000 × 10 −79 = 0. Biorąc pod uwagę ułamek wszystkich bitów zero, dowolna kombinacja dodatniego lub ujemnego bitu znaku i niezerowego wykładnika da wartość arytmetycznie równą zeru. Jednak znormalizowana postać generowana dla zera przez sprzęt procesora to zero-bitowe zero. Dotyczy to wszystkich trzech formatów precyzji zmiennoprzecinkowej. Dodawanie lub odejmowanie z innymi wartościami wykładników może spowodować utratę precyzji wyniku.

Kwestie precyzji

Ponieważ podstawa wynosi 16, w cyfrze binarnej mantysa może zawierać do trzech wiodących bitów zerowych. Oznacza to, że po przekształceniu liczby na postać binarną precyzja może wynosić zaledwie 21 bitów. Ze względu na efekt „chwiejnej precyzji” niektóre obliczenia mogą być bardzo niedokładne. Wywołało to znaczną krytykę.

Dobrym przykładem niedokładności jest przedstawienie wartości dziesiętnej 0,1. Nie ma dokładnej reprezentacji binarnej ani szesnastkowej. W formacie szesnastkowym jest reprezentowany jako 0.19999999... 16 lub 0.0001 1001 1001 1001 1001 1001 1001... 2 , czyli:

S Do potęgi Frakcja  
0 100 0000 0001 1001 1001 1001 1001 1010  

Ma tylko 21 bitów, podczas gdy wersja binarna ma 24 bity precyzji.

Sześć cyfr szesnastkowych precyzji odpowiada w przybliżeniu sześciu cyfrom dziesiętnym (tj. (6 − 1) log 10 (16) ≈ 6,02). Konwersja szesnastkowej liczby zmiennoprzecinkowej pojedynczej precyzji na ciąg dziesiętny wymagałaby co najmniej 9 cyfr znaczących (tj. 6 log 10 (16) + 1 ≈ 8,22), aby przekonwertować z powrotem na tę samą szesnastkową wartość zmiennoprzecinkową.

Podwójna precyzja 64-bitowa

Format HFP o podwójnej precyzji (nazywany przez IBM „długim”) jest taki sam jak format „krótki”, z wyjątkiem tego, że pole ułamkowe jest szersze, a liczba o podwójnej precyzji jest przechowywana w podwójnym słowie (8 bajtów):

1 7 56 (szerokość w bitach)
S Do potęgi Frakcja  
63 62 ... 56 55 ... 0 (indeks bitów) *
* Dokumentacja IBM numeruje bity od lewej do prawej, tak że najbardziej znaczący bit jest oznaczony jako bit numer 0.

Wykładnik dla tego formatu obejmuje tylko około jednej czwartej zakresu odpowiadającego mu formatu binarnego IEEE.

14 cyfr szesnastkowych precyzji odpowiada mniej więcej 17 cyfrom dziesiętnym. Konwersja szesnastkowej liczby zmiennoprzecinkowej podwójnej precyzji na ciąg dziesiętny wymagałaby co najmniej 18 cyfr znaczących, aby przekonwertować z powrotem na tę samą szesnastkową wartość zmiennoprzecinkową.

Rozszerzona precyzja 128-bitowa

Nazywany przez IBM formatem o zwiększonej precyzji, format HFP o poczwórnej precyzji został dodany do serii System / 370 i był dostępny w niektórych modelach S / 360 (S / 360-85, -195 i inne na specjalne życzenie lub symulowane przez oprogramowanie systemu operacyjnego ). Pole ułamka o rozszerzonej precyzji jest szersze, a liczba o rozszerzonej precyzji jest przechowywana jako dwa słowa podwójne (16 bajtów):

Część wysokiego rzędu
1 7 56 (szerokość w bitach)
S Do potęgi Ułamek (14 cyfr wysokiego rzędu)  
127 126 ... 120 119 ... 64 (indeks bitów) *
Część niskiego rzędu
8 56 (szerokość w bitach)
Nie używany Ułamek (14 cyfr niskiego rzędu)  
63 ... 56 55 ... 0 (indeks bitów) *
* Dokumentacja IBM numeruje bity od lewej do prawej, tak że najbardziej znaczący bit jest oznaczony jako bit numer 0.

28 cyfr szesnastkowych precyzji odpowiada mniej więcej 32 cyfrom dziesiętnym. Konwersja HFP o rozszerzonej precyzji na ciąg dziesiętny wymagałaby co najmniej 35 cyfr znaczących, aby przekonwertować z powrotem na tę samą wartość HFP. Przechowywany wykładnik w części niższego rzędu jest o 14 mniejszy niż w części wyższego rzędu, chyba że byłby mniejszy od zera.

Działania arytmetyczne

Dostępne operacje arytmetyczne to dodawanie i odejmowanie, zarówno znormalizowane, jak i nieznormalizowane, oraz porównanie. Prenormalizacja jest wykonywana na podstawie różnicy wykładników. Pomnóż i podziel wstępnie znormalizuj nieznormalizowane wartości i obetnij wynik po jednej cyfrze ochronnej. Istnieje operacja na pół, aby uprościć dzielenie przez dwa. Począwszy od ESA/390 istnieje operacja pierwiastkowania kwadratowego. Wszystkie operacje mają jedną szesnastkową cyfrę ochronną, aby uniknąć utraty precyzji. Większość operacji arytmetycznych jest obcinana jak proste kalkulatory kieszonkowe. Dlatego 1 − 16 −8 = 1. W tym przypadku wynik jest zaokrąglany od zera.

IEEE 754 na komputerach mainframe IBM

Począwszy od S/390 G5 w 1998 roku, komputery mainframe IBM zawierały również binarne jednostki zmiennoprzecinkowe IEEE, które są zgodne ze standardem IEEE 754 dla arytmetyki zmiennoprzecinkowej . Dziesiętny zmiennoprzecinkowy IEEE został dodany do IBM System z9 GA2 w 2007 roku przy użyciu milikodu , aw 2008 roku do IBM System z10 sprzętowo.

Nowoczesne komputery mainframe IBM obsługują trzy podstawy zmiennoprzecinkowe z 3 formatami szesnastkowymi (HFP), 3 formatami binarnymi (BFP) i 3 formatami dziesiętnymi (DFP). Na rdzeń przypadają dwie jednostki zmiennoprzecinkowe; jeden obsługujący HFP i BFP, a drugi obsługujący DFP; istnieje jeden plik rejestru, FPRs, który zawiera wszystkie 3 formaty. Począwszy od Z13 w 2015 r. procesory dodały funkcję wektorową, która obejmuje 32 rejestry wektorowe, każdy o szerokości 128 bitów; rejestr wektorowy może zawierać dwie 64-bitowe lub cztery 32-bitowe liczby zmiennoprzecinkowe. Tradycyjne 16 rejestrów zmiennoprzecinkowych jest nałożonych na nowe rejestry wektorowe, więc niektórymi danymi można manipulować za pomocą tradycyjnych instrukcji zmiennoprzecinkowych lub nowszych instrukcji wektorowych.

Zastosowania specjalne

Format IBM HFP jest używany w:

Ponieważ IBM jest jedynym pozostałym dostawcą sprzętu korzystającego z formatu HFP, a jedynymi maszynami IBM obsługującymi ten format są ich komputery mainframe, wymaga tego niewiele formatów plików. Jedynym wyjątkiem jest format pliku SAS 5 Transport, którego wymaga FDA; w tym formacie „Wszystkie liczby zmiennoprzecinkowe w pliku są przechowywane przy użyciu reprezentacji komputerów mainframe IBM. [...] Większość platform używa reprezentacji liczb zmiennoprzecinkowych IEEE. [...] Aby pomóc w czytaniu i / lub zapisując pliki transportowe, udostępniamy procedury konwersji z reprezentacji IEEE (big endian lub little endian) na reprezentację transportu iz powrotem”. Kod dla formatu IBM jest również dostępny pod LGPLv2.1 .

Systemy korzystające z formatu zmiennoprzecinkowego IBM

Zobacz też

Dalsza lektura