Formatul în virgulă mobilă cu semiprecizie, abreviat FP16 sau float16, este un format de reprezentare în memoria calculatoarelor a numerelor reale. Reprezentarea ocupă 16 biți și poate reprezenta în sistemul virgulă mobilă o gamă de numere la care precizia nu este esențială, de exemplu în sau în rețelele neurale.

Aproape toate utilizările moderne respectă standardul IEEE 754-2008, unde formatul cu baza 2 pe 16 biți este denumit binary16, iar exponentul folosește 5 biți. Aceasta poate exprima valori în intervalul valoarea minimă mai mare decât 1 fiind

Istoric Au existat mai multe formate anterioare cu virgulă mobilă pe 16 biți, inclusiv cel al HD61810 DSP de la Hitachi din 1982 (cu exponent pe 4 biți și o mantisă pe 12 biți), cel format din primii 16 biți ai unui format cu precizie simplă pe 32 de biți (8 biți pentru exponent și 7 biți pentru mantisă), format numit , formatul WIF-ul lui Thomas J. Scott din 1991 (cu exponentul pe 5 biți și mantisa pe 10 biți) și cel al coprocesorului grafic din 1995 al (la fel cu cel al Hitachi).

căuta un format de imagine care să poată gestiona o gamă dinamică mare, dar fără costurile pentru discul dur sau pentru memorie în cazul imaginilor codificate în virgulă mobilă cu precizie simplă sau dublă. Grupul de umbrire programabilă accelerată hardware de la Silicon Graphics, condus de John Airey, a folosit în 1997 tipul de date s10e5 (10 semnificand, 5 exponent) ca parte a efortului de proiectare „bali”. Descrierea a apărut într-un articol prezentat la conferința SIGGRAPH din 2000 și apoi brevetat în patentul USA 7518615. Formatul a fost popularizat prin utilizarea lui în formatul cu sursă deschisă OpenEXR pentru imagini.

Nvidia și Microsoft au definit tipul de date half în limbajul , lansat la începutul anului 2002, și l-au implementat hardware în seria GeForce FX, lansată la sfârșitul anului 2002. Totuși, suportul hardware pentru virgulă mobilă accelerată pe 16 biți a fost ulterior abandonat de Nvidia înainte de a fi reintrodus în 2015 în GPU-ul mobil Tegra X1.

Extensia din 2012 permite procesoarelor x86 să convertească numere în virgulă mobilă cu semiprecizie în și din virgulă mobilă cu precizie simplă prin instrucțiuni hardware.

Standardul IEEE 754: binary16 Standardul IEEE 754 descrie binary16 ca având: 1 , 5 biți exponent deplasat, cu exces 15. 11 biți (din care stocați efectiv 10) de semnificand.

Biții sunt poziționați în modul următor:

În reprezentare se consideră că primul bit al semnificandului este implicit și are valoarea 1, cu excepția cazului în care câmpul exponentului conține doar zerouri. Astfel, în formatul de memorie apar doar 10 biți ai semnificandului, dar precizia totală este de 11 biți. În jargonul IEEE 754, există 10 biți de semnificand, dar 11 biți de precizie a semnificandului, care oferă cifre zecimale.

Valori particulare în reprezentarea binary16 Exemplele sunt în reprezentare binară, hexazecimală și zecimală. Binar Hexa Calcul Valoare Observații 0 00000 0000000001 0001 2−14 × (0 + ) ≈0,000000059604645 Cel mai mic număr pozitiv nenormalizat 0 00000 1111111111 03ff 2−14 × (0 + ) ≈0,000060975552 Cel mai mare număr pozitiv nenormalizat 0 00001 0000000000 0400 2−14 × (1 + ) ≈0,00006103515625 Cel mai mic număr pozitiv normalizat 0 01101 0101010101 3555 2−2 × (1 + ) ≈0,33325195 1/3 0 01110 1111111111 3bff 2−1 × (1 + ) ≈0,99951172 Cel mai mare număr subunitar 0 01111 0000000000 3c00 20 × (1 + ) 1 (unu) 0 01111 0000000001 3c01 ≈1,00097656 Cel mai mic număr mai mare decât 1 0 11001 1111111111 67ff 210 × (1 + ) 2047 Cel mai mare număr impar 0 11110 1111111111 7bff 215 × (1 + ) 65504 Cel mai mare număr normalizat 0 10000 1001001000 4248 21 × (1 + ) 3,140625 Cea mai apropiată valoare de 0000 0 1 00000 0000000000 8000 −0 1 10000 0000000000 c000 (−1)1 × 21 × (1 + ) −2 0 11111 0000000000 7c00 infinit 1 11111 0000000000 fc00 −infinit

Implicit, 1/3 este rotunjit în jos, ca în precizie dublă, datorită numărului par de biți din semnificant. Biții lui 1/3 dincolo de punctul de rotunjire sunt 0101..., care este mai puțin decât 1/2 din unitatea de pe ultimul loc.

Formatul alternativ cu semiprecizie ARM Procesoarele ARM acceptă (prin setarea bitului de control al virgulei mobile din registrul de control) un format „alternativ de semiprecizie”, care elimină cazul particular pentru o valoare a exponentului de 31 (111112). Formatul alternativ este aproape identic cu formatul IEEE, dar nu există o codificare pentru infinit sau NaN; exponentul 31 codifică numere normalizate în intervalul 65536–131008.

Utilizarea semipreciziei Semiprecizia este utilizată în mai multe medii de grafică digitală pentru stocarea pixelilor, inclusiv MATLAB, , , GIMP, OpenGL, , , și . Avantajul față de numerele întregi pe 8 sau 16 biți este că intervalul dinamic crescut permite păstrarea mai multor detalii în zonele luminoase și umbrite din imagini și evită corecția gamma. Avantajul față de numerele în virgulă mobilă cu precizie simplă pe 32 de biți este că necesită jumătate din spațiul de stocare și din viteza de transfer a datelor, în detrimentul preciziei și a gamei.

Semiprecizia poate fi utilă pentru cuantificarea . De obicei datele rețelei sunt stocate în vurgulă mobilă cu precizie simplă (pe 32 de biți) pentru noduri, însă în unele situații este acceptabil să se reducă precizia la doar semiprecizie (pe 16 biți), care necesită doar jumătate din spațiul de stocare, în detrimentul unei anumite precizii. Cuantificarea rețelei se poate face și cu precizie fixă pe 8 biți sau 16 biți, în funcție de cerințe.

Hardware-ul și software-ul pentru învățarea automată sau rețele neuronale tind să utilizeze semiprecizia: astfel de aplicații efectuează de obicei un volum mare de calcule, dar nu necesită un nivel ridicat de precizie. Deoarece hardware-ul nu acceptă de obicei formatul virgulă mobilă cu semiprecizie de 16 biți, rețelele neuronale utilizează adesea formatul , care este formatul cu virgulă mobilă de precizie simplă trunchiat la 16 biți.

Dacă hardware-ul are instrucțiuni pentru calcule matematice în semiprecizie, acesta este adesea mai rapid decât cel cu precizie simplă sau dublă. Dacă sistemul are instrucțiuni SIMD care pot gestiona mai multe numere în virgulă mobilă printr-o singură instrucțiune, semiprecizia poate fi de două ori mai rapidă operând simultan de două ori mai multe numere.

Suportul în limbajele de programare oferă suport pentru semiprecizie prin tipul său f16.

5 a introdus numere cu virgulă mobilă cu semiprecizie prin tipul standard de bibliotecă System.Half. La 16 iulie 2025 niciun limbaj .NET (C#, , , și C++/CX) nu avea o expresie (de exemplu, în C#, 1.0f are tipul System.Single sau 1.0m are tipul System.Decimal) sau un cuvânt cheie pentru tip.

Swift a introdus numerele în virgulă mobilă cu semiprecizie în Swift 5.3 cu tipul Float16].

acceptă și el numere în virgulă mobilă cu semiprecizie, cu tipul de date half, în formatul de stocare half-precision IEEE 754-2008.

La 16 iulie 2025 la Rust se lucra la adăugarea unui nou tip f16 pentru numerele în virgulă mobilă pe 16 biți cu semiprecizie IEEE.

oferă suport pentru numere în virgulă mobilă cu semiprecizie de tip Float16.

C++ a introdus semiprecizia începând cu C++23 cu tipul std::float16_t. GCC a implementat deja suportul pentru acesta.

Suportul hardware Mai multe versiuni ale arhitecturii ARM au suport pentru semiprecizie.

Suportul pentru conversii în virgulă mobilă cu semiprecizie în x86 este specificat în extensia setului de instrucțiuni , introdusă pentru prima dată în 2009 de AMD și adoptată pe scară largă de procesoarele AMD și Intel până în 2012. Aceasta a fost extinsă în continuare prin extensia setului de instrucțiuni implementată în procesoarele Intel Sapphire Rapids.

În codurile Zfh și Zfhmin oferă suport hardware pentru virgulă mobilă cu semiprecizie pe 16 biți. Extensia Zfhmin este o alternativă minimală la Zfh.

VSX și încă neaprobata extensie SVP64 oferă suport hardware pentru numere în virgulă mobilă cu semiprecizie pe 16 biți începând cu PowerISA v3.1B și următoarele.

Suportul pentru semiprecizie pe face parte din facilitatea de asistență la procesarea rețelelor neuronale introdusă de IBM odată cu . IBM se referă la tipul de date în virgulă mobilă cu semiprecizie ca NNP-Data-Type 1 (pe 16 biți).

Note

Vezi și Formatul în virgulă mobilă cu precizie simplă Formatul în virgulă mobilă cu precizie dublă Formatul în virgulă mobilă cu precizie cvadruplă Precizie extinsă

Lectură suplimentară Khronos Vulkan signed 16-bit floating point format

Legături externe

Minifloats (in Survey of Floating-Point Formats) OpenEXR site

Categorie:Aritmetica calculatoarelor Categorie:Tipuri de date