Formatul IBM de virgulă mobilă hexazecimală (abreviat HFP de la denumirea dată de IBM: hexadecimal floating point) este un format de reprezentare în memoria calculatoarelor de tip a numerelor reale și a altor computere bazate pe această arhitectură, IBM System/360 Principles of Operation, IBM Publication A22-6821-6, Seventh Edition (January 13, 1967), pp.41-50 IBM System/370 Principles of Operation, IBM Publication GA22-7000-4, Fifth Edition (September 1, 1975), pp.157-170 z/Architecture Principles of Operation, IBM Publication SA22-7832-01, Second Edition (October, 2001), chapter 9 ff. precum și pe mașini destinate să fie compatibile cu aplicațiile System/360. În comparație cu virgula mobilă conform IEEE 754, formatul HFP are un semnificand mai lung și un exponent mai scurt. Toate formatele HFP au exponentul pe 7 biți, deplasat cu un exces de 64. Intervalul normalizat al numerelor reprezentabile este de la până la (aproximativ de la până la ). Un număr este reprezentat conform formulei:
Precizie simplă pe 32 de biți Un număr formatul HFP în precizie simplă (numit „short” de IBM, în ) este stocat pe un cuvânt de 32 de biți:
|- style="text-align:center" |style="width:20px"|1 |style="width:20px"| |style="width:50px"|7 |style="width:20px"| |style="width:20px"| |style="width:210px"|24 |style="width:20px"| |style="text-align:left"|(mărime, în biți) |- style="text-align:center" |colspan="1" style="text-align:center;background-color:#FC9"|S |colspan="3" style="text-align:center;background-color:#99F"|Exponent |colspan="3" style="text-align:center;background-color:#9F9"|Fracție |colspan="1" style="text-align:center;background-color:#FFF"| |- style="text-align:center" |31 |30 |... |24 |23 |... |0 |align="left"|(index biți)* |- |colspan="8"| * Documentația IBM numerotează biții de la stânga la dreapta, astfel încât bitul cel mai semnificativ este bitul numărul 0.
În acest format bitul inițial nu este ascuns, iar virgula hexazecimală este poziționată la stânga semnificandului („fracția” din documentația IBM și din figuri).
Deoarece baza este 16, exponentul în această formă este de aproximativ două ori mai mare decât echivalentul din IEEE 754; pentru a avea un interval similar de exponenți în binar, ar fi necesari 9 biți de exponent.
Exemplu Să se codifice valoarea −118,625 în formatul HFP scurt.
Valoarea este negativă, deci bitul de semn este 1.
Valoarea 118,62510 este în binar Această valoare este normalizată prin mutarea virgulei hexazecimale la stânga cu patru biți (o cifră hexazecimală) odată, până când cea mai din stânga cifră devine zero, rezultând 0,011101101012. Pozițiile din dreapta rămase sunt completate cu zerouri, rezultând o fracție pe 24 de biți:
Normalizarea a mutat virgula cu două cifre hexazecimale la stânga, rezultând un exces și un exponent de 16+2. Excesul de +64 este adăugat exponentului (+2), rezultând +66, care este
Combinând semnul, exponentul plus excesul și fracția normalizată rezultă următoarea codificare:
|- style="text-align:center" |style="width:20px;text-align:center;background-color:#FC9"|S |style="width:90px;text-align:center;background-color:#99F"|Exponent |style="width:290px;text-align:center;background-color:#9F9"|Fracție |style="text-align:center;background-color:#FFF"| |- style="text-align:center" |style="text-align:center;background-color:#FEC"| |style="text-align:center;background-color:#CCF"| |style="text-align:center;background-color:#CFC"| |style="text-align:center;background-color:#FFF"|
Altfel spus, reprezentarea numărului este
Cel mai mare număr reprezentabil {| |- style="text-align:center" |style="width:20px;text-align:center;background-color:#FC9"|S |style="width:90px;text-align:center;background-color:#99F"|Exponent |style="width:290px;text-align:center;background-color:#9F9"|Fracție |style="text-align:center;background-color:#FFF"| |- style="text-align:center" |style="text-align:center;background-color:#FEC"| |style="text-align:center;background-color:#CCF"| |style="text-align:center;background-color:#CFC"| |style="text-align:center;background-color:#FFF"|
Reprezentarea numărului este
Cel mai mic număr reprezentabil {| |- style="text-align:center" |style="width:20px;text-align:center;background-color:#FC9"|S |style="width:90px;text-align:center;background-color:#99F"|Exponent |style="width:290px;text-align:center;background-color:#9F9"|Fracție |style="text-align:center;background-color:#FFF"| |- style="text-align:center" |style="text-align:center;background-color:#FEC"| |style="text-align:center;background-color:#CCF"| |style="text-align:center;background-color:#CFC"| |style="text-align:center;background-color:#FFF"|
Reprezentarea numărului este
Deși teoretic formatul ar putea reprezenta numere nenormalizate mai mici, rezultate din calcul, acestea determină o „depășire inferioară” în virgulă mobilă. Uzual, această depășire este mascată, adică nu produce oprirea calculatorului, însă valoarea nenormalizată rezultată este făcută zero.Baltac ș.a., 1974, p. 67
Zero {| |- style="text-align:center" |style="width:20px;text-align:center;background-color:#FC9"|S |style="width:90px;text-align:center;background-color:#99F"|Exponent |style="width:290px;text-align:center;background-color:#9F9"|Fracție |style="text-align:center;background-color:#FFF"| |- style="text-align:center" |style="text-align:center;background-color:#FEC"| |style="text-align:center;background-color:#CCF"| |style="text-align:center;background-color:#CFC"| |style="text-align:center;background-color:#FFF"|
Zero (0,0) este reprezentat în formă normalizată cu toți biții „0”, care, aritmetic, este valoarea Având în vedere o fracțiune de toți biții egală cu zero, orice combinație cu bitul de semn pozitiv sau negativ și un exponent diferit de zero va produce o valoare aritmetic egală cu zero. Totuși, forma normalizată generată pentru zero de hardware-ul CPU este cu toți biții „0”. Acest lucru este valabil pentru toate formatele de precizie în virgulă mobilă. Adunarea sau scăderea cu alte valori ale exponenților poate pierde precizia rezultatului.
Probleme de precizie Deoarece baza este 16, pot exista până la trei biți 0 la început în semnificandul binar. Aceasta înseamnă că atunci când numărul este convertit în binar, pot exista doar 21 de biți de precizie. Din cauza efectului de „precizie oscilantă”, acest lucru poate face ca unele calcule să fie foarte inexacte. Acest lucru a provocat critici considerabile.
Un bun exemplu de inexactitate este reprezentarea valorii zecimale 0,1. Aceasta nu are o reprezentare binară sau hexazecimală exactă. În format hexazecimal este reprezentată ca sau adică:
|- style="text-align:center" |style="width:20px;text-align:center;background-color:#FC9"|S |style="width:90px;text-align:center;background-color:#99F"|Exponent |style="width:290px;text-align:center;background-color:#9F9"|Fracție |style="text-align:center;background-color:#FFF"| |- style="text-align:center" |style="text-align:center;background-color:#FEC"| |style="text-align:center;background-color:#CCF"| |style="text-align:center;background-color:#CFC"| |style="text-align:center;background-color:#FFF"|
Aceasta are doar 21 de biți, în timp ce versiunea binară are 24 de biți de precizie.
Șase cifre hexazecimale de precizie sunt aproximativ echivalente cu șase cifre zecimale (adică O conversie a unui număr în virgulă mobilă hexazecimală cu precizie simplă într-un șir zecimal ar necesita cel puțin 9 cifre semnificative (adică ) pentru ca valoarea zecimală să fie convertită înapoi la aceeași valoare în virgulă mobilă hexazecimală.
Precizie dublă pe 64 de biți Un număr formatul HFP în precizie dublă (numit „long” de IBM, în ) este același cu formatul „scurt”, cu excepția faptului că câmpul fracției este mai mare, iar numărul cu precizie dublă este stocat într-un cuvânt dublu (pe 8 octeți):
|- style="text-align:center" |style="width:20px"|1 |style="width:20px"| |style="width:50px"|7 |style="width:20px"| |style="width:20px"| |style="width:320px"|56 |style="width:20px"| |style="text-align:left"|(mărime, în biți) |- style="text-align:center" |colspan="1" style="text-align:center;background-color:#FC9"|S |colspan="3" style="text-align:center;background-color:#99F"|Exponent |colspan="3" style="text-align:center;background-color:#9F9"|Fracție |colspan="1" style="text-align:center;background-color:#FFF"| |- style="text-align:center" |63 |62 |... |56 |55 |... |0 |align="left"|(index biți)* |- |colspan="8"| * Documentația IBM numerotează biții de la stânga la dreapta, astfel încât bitul cel mai semnificativ este bitul numărul 0.
Exponentul acestui format acoperă doar aproximativ un sfert din intervalul formatului binar IEEE corespunzător.
Preciza celor 14 cifre hexazecimale este aproximativ echivalentă cu cea a 17 cifre zecimale. O conversie a unui număr hexazecimal cu precizie dublă într-un număr zecimal ar necesita cel puțin 18 cifre semnificative pentru a o converti înapoi la aceeași valoare în numărul hexazecimal.
Precizie extinsă pe 128 de biți Numită de IBM precizie extinsă, un format HFP precizie cvadruplă a fost adăugat la seria System/370 și era disponibil pe unele modele S/360 (S/360-85, -195 și altele la cerere specială sau simulat de software-ul sistemului de operare). Câmpul fracției de precizie extinsă este mai mare, iar numărul cu precizie extinsă este stocat ca două cuvinte duble (pe 16 octeți):
|colspan="8" |Partea de ordin superior |- style="text-align:center" |style="width:20px"|1 |style="width:20px"| |style="width:50px"|7 |style="width:20px"| |style="width:20px"| |style="width:320px"|56 |style="width:20px"| |style="text-align:left"|(mărime, în biți) |- style="text-align:center" |colspan="1" style="text-align:center;background-color:#FC9"|S |colspan="3" style="text-align:center;background-color:#99F"|Exponent |colspan="3" style="text-align:center;background-color:#9F9"|Fracție (ordin superior, 14 cifre) |colspan="1" style="text-align:center;background-color:#FFF"| |- style="text-align:center" |127 |126 |... |120 |119 |... |64 |align="left"|(index biți)* |- |colspan="8" |Partea de ordin inferior |- style="text-align:center" |colspan="4"|8 | |56 | |style="text-align:left"|(mărime, în biți) |- style="text-align:center" |colspan="4" style="text-align:center;background-color:#CCC"|Nefolosit |colspan="3" style="text-align:center;background-color:#9F9"|Fracție (ordin inferior, 14 cifre) |colspan="1" style="text-align:center;background-color:#FFF"| |- style="text-align:center" |63 |colspan="2"|... |56 |55 |... |0 |align="left"|(index biți)* |- |colspan="8"| * Documentația IBM numerotează biții de la stânga la dreapta, astfel încât bitul cel mai semnificativ este bitul numărul 0.
Ca precizie, 28 de cifre hexazecimale sunt aproximativ echivalente cu 32 de cifre zecimale. O conversie a unui HFP cu precizie extinsă într-un șir zecimal ar necesita cel puțin 35 de cifre semnificative pentru a converti valoarea înapoi la aceeași valoare HFP. Exponentul stocat în partea de ordin inferior este cu 14 cifre mai mic decât partea de ordin superior, cu excepția cazului în care acesta ar fi mai mic decât zero.
Operații aritmetice Operațiile aritmetice disponibile sunt adunarea și scăderea, atât normalizate, cât și nenormalizate, și compararea. Prenormalizarea se face pe baza diferenței exponenților. Înmulțirea și împărțirea prenormalizează valorile nenormalizate și trunchiază rezultatul după o cifră de gardă. Există o operație de înjumătățire pentru a simplifica împărțirea la 2. Începând cu ESA/390, există o operație de extragere a rădăcinii pătrate. Toate operațiile au o cifră de gardă hexazecimală pentru a evita pierderile de precizie. Majoritatea operațiilor aritmetice se trunchiază ca la niște calculatoare de buzunar simple. Prin urmare, În acest caz rezultatul este rotunjit dinspre zero („spre cel mai apropiat”).
IEEE 754 pe mainframe-uri IBM