La precisión media (a veces llamada FP16 o float16 ) es un formato numérico binario de punto flotante que ocupa 16 bits (dos bytes en las computadoras modernas) en la memoria . Está diseñado para almacenar valores de punto flotante en aplicaciones donde no se requiere una mayor precisión, en particular en el procesamiento de imágenes y las redes neuronales .
Casi todos los usos modernos siguen el estándar IEEE 754-2008 , donde el formato de base 2 de 16 bits se denomina binary16 y el exponente utiliza 5 bits. Esto permite expresar valores en el rango de ±65.504, siendo el valor mínimo superior a 1 1 + 1/1024.
Historia
Han existido varios formatos de punto flotante de 16 bits anteriores, incluido el del DSP HD61810 de Hitachi de 1982 (un exponente de 4 bits y una mantisa de 12 bits), [ 1 ] los 16 bits superiores de un flotante de 32 bits (8 bits de exponente y 7 de mantisa) llamado bfloat16 , y el WIF de Thomas J. Scott de 1991 (5 bits de exponente, 10 bits de mantisa) [ 2 ] y el procesador gráfico 3dfx Voodoo de 1995 (igual que Hitachi). [ 3 ]
ILM buscaba un formato de imagen que pudiera manejar un amplio rango dinámico , pero sin el costo de disco duro y memoria de punto flotante de precisión simple o doble. [ 4 ] El grupo de sombreado programable acelerado por hardware dirigido por John Airey en SGI (Silicon Graphics) utilizó el tipo de datos s10e5 en 1997 como parte del esfuerzo de diseño "bali". Esto se describe en un artículo de SIGGRAPH 2000 [ 5 ] (ver sección 4.3) y se documenta además en la patente estadounidense 7518615. [ 6 ] Se popularizó por su uso en el formato de imagen de código abierto OpenEXR .
Nvidia y Microsoft definieron el tipo de datos half en el lenguaje Cg , lanzado a principios de 2002, y lo implementaron en silicio en la GeForce FX , lanzada a finales de 2002. [ 7 ] Sin embargo, Nvidia posteriormente eliminó el soporte de hardware para punto flotante acelerado de 16 bits antes de reintroducirlo en la GPU móvil Tegra X1 en 2015.
La extensión F16C de 2012 permite a los procesadores x86 convertir números de coma flotante de precisión media a números de coma flotante de precisión simple y viceversa mediante una instrucción de máquina.
Formato binario de punto flotante de precisión media IEEE 754: binary16
El estándar IEEE 754 [ 8 ] especifica que un binario16 tiene el siguiente formato:
- Bit de signo : 1 bit
- Ancho del exponente : 5 bits
- Precisión significativa : 11 bits (10 almacenados explícitamente)
El formato se presenta de la siguiente manera:
![]()
Se asume que el formato tiene un bit de adelanto implícito con valor 1 a menos que el campo del exponente se almacene con todos ceros. Por lo tanto, solo aparecen 10 bits de la mantisa en el formato de memoria, pero la precisión total es de 11 bits. En la terminología IEEE 754, hay 10 bits de mantisa, pero hay 11 bits de precisión de mantisa (log 10 (2 11 ) ≈ 3,311 dígitos decimales, o 4 dígitos ± un poco menos de 5 unidades en el último lugar ).
Codificación exponencial
El exponente binario de punto flotante de precisión media se codifica utilizando una representación binaria con desplazamiento , donde el desplazamiento cero es 15; también conocido como sesgo del exponente en el estándar IEEE 754. [ 8 ]
- E mín = 00001 2 − 01111 2 = −14
- E máx = 11110 2 − 01111 2 = 15
- Sesgo del exponente = 01111 2 = 15
Por lo tanto, como lo define la representación binaria de desplazamiento, para obtener el exponente verdadero hay que restar un desplazamiento de 15 al exponente almacenado.
Los exponentes almacenados 00000 2 y 11111 2 se interpretan de forma especial.
El valor mínimo estrictamente positivo (subnormal) es 2 −24 ≈ 5,96 × 10 −8 . El valor mínimo positivo normal es 2 −14 ≈ 6,10 × 10 −5 . El valor máximo representable es (2−2 −10 ) × 2 15 = 65504.
Ejemplos de precisión media
Estos ejemplos se presentan en representación binaria del valor de punto flotante. Esto incluye el bit de signo, el exponente (sesgado) y la mantisa.
Por defecto, 1/3 se redondea hacia abajo como en precisión doble , debido al número impar de bits en la mantisa. Los bits más allá del punto de redondeo son 0101 ... que es menos de 1/2 de una unidad en el último lugar .
ARM alternativa de media precisión
Los procesadores ARM admiten (a través de un bit del registro de control de punto flotante ) un formato de "media precisión alternativa", que elimina el caso especial para un valor de exponente de 31 (11111 2 ). [ 9 ] Es casi idéntico al formato IEEE, pero no hay codificación para infinito o NaN; en cambio, un exponente de 31 codifica números normalizados en el rango de 65536 a 131008.
Usos de la precisión media
La precisión media se utiliza en varios entornos de gráficos por computadora para almacenar píxeles, incluidos MATLAB , OpenEXR , JPEG XR , GIMP , OpenGL , Vulkan , [ 10 ] Cg , Direct3D y D3DX . La ventaja sobre los enteros de 8 o 16 bits es que el mayor rango dinámico permite preservar más detalles en las luces y sombras de las imágenes, y evita la corrección gamma. La ventaja sobre el punto flotante de precisión simple de 32 bits es que requiere la mitad del almacenamiento y el ancho de banda (a costa de la precisión y el rango). [ 4 ]
La precisión media puede ser útil para la cuantización de mallas . Los datos de la malla generalmente se almacenan usando números de coma flotante de precisión simple de 32 bits para los vértices; sin embargo, en algunas situaciones es aceptable reducir la precisión a solo 16 bits de precisión media, lo que requiere solo la mitad del almacenamiento a costa de cierta precisión. La cuantización de mallas también puede realizarse con precisión fija de 8 o 16 bits, según los requisitos. [ 11 ]
El hardware y el software para el aprendizaje automático y las redes neuronales suelen utilizar aritmética de precisión media para acelerar los cálculos. En estas aplicaciones, a veces se prefiere el formato bfloat16 por su rango dinámico más amplio que la precisión media, [ 12 ] y cada vez se utilizan más formatos de punto flotante especializados con solo 8 bits o menos para acelerar aún más ciertos cálculos.
Si el hardware dispone de instrucciones para realizar cálculos matemáticos de precisión media, suele ser más rápido que la precisión simple o doble, a veces hasta cuatro veces más rápido. Además, si el sistema dispone de instrucciones SIMD , a menudo una sola instrucción puede operar simultáneamente con el doble de valores de precisión media que de valores de punto flotante. [ 13 ]
Soporte mediante lenguajes de programación
Zig , Odin y otros lenguajes brindan soporte para precisiones medias con su f16tipo. [ 14 ] [ 15 ]
.NET 5 introdujo números de coma flotante de precisión media con el System.Halftipo de biblioteca estándar. [ 16 ] [ 17 ] A partir del 16 de julio de 2025 Ningún lenguaje .NET ( C# , F# , Visual Basic , C++/CLI y C++/CX ) tiene literales (por ejemplo, en C#, 1.0ftiene tipo System.Singleo 1.0mtiene tipo System.Decimal) ni una palabra clave para el tipo. [ 18 ] [ 19 ] [ 20 ]
Swift introdujo los números de punto flotante de precisión media en Swift 5.3 con el Float16tipo. [ 21 ]
OpenCL también admite números de punto flotante de precisión media con el tipo de datos half en el formato de almacenamiento de precisión media IEEE 754-2008. [ 22 ]
A fecha de 31 de mayo de 2026 Rust está trabajando actualmente en la adición de un nuevo tipo para números de coma flotante def16 16 bits de precisión media IEEE. [ 23 ]
Julia proporciona soporte para números de punto flotante de precisión media con el Float16tipo. [ 24 ]
C++ introdujo la precisión media desde C++23 con el std::float16_ttipo. [ 25 ] GCC ya implementa soporte para ello. [ 26 ]
Soporte de hardware
Varias versiones de la arquitectura ARM admiten precisión media. [ 27 ]
La compatibilidad con conversiones de coma flotante de precisión media en el conjunto de instrucciones x86 se especifica en la extensión del conjunto de instrucciones F16C , introducida por primera vez en 2009 por AMD y adoptada de forma bastante generalizada por las CPU de AMD e Intel en 2012. Esta se extendió posteriormente a la extensión del conjunto de instrucciones AVX-512_FP16 implementada en el procesador Intel Sapphire Rapids . [ 28 ]
En RISC-V , las extensionesZfh y proporcionan soporte de hardware para números de coma flotante de precisión media de 16 bits. La extensión es una alternativa mínima a . [ 29 ]ZfhminZfhminZfh
En Power ISA , VSX y la extensión SVP64, aún no aprobada, proporcionan soporte de hardware para coma flotante de precisión media de 16 bits a partir de PowerISA v3.1B y versiones posteriores. [ 30 ] [ 31 ]
La compatibilidad con precisión media en IBM Z forma parte de la función de asistencia para el procesamiento de redes neuronales que IBM introdujo con Telum . IBM se refiere a los datos de punto flotante de precisión media como NNP-Data-Type 1 (16 bits).
Véase también
- Formato de punto flotante bfloat16 : Formato alternativo de punto flotante de 16 bits con 8 bits de exponente y 7 bits de mantisa.
- Minifloat : formatos de punto flotante pequeños
- IEEE 754 : Norma IEEE para aritmética de punto flotante (IEEE 754)
- ISO/IEC 10967 , Aritmética independiente del lenguaje
- Tipo de datos primitivo
- formato de imagen RGBE
- Bus de administración de energía § Formato de punto flotante Linear11
Referencias
- ↑ "hitachi :: dataBooks :: HD61810 Manual del usuario del procesador de señal digital" . Archive.org . Consultado el 14 de julio de 2017 .
- ↑ Scott, Thomas J. (marzo de 1991). «Las matemáticas y la informática discrepan sobre los números reales». Actas del vigésimo segundo simposio técnico SIGCSE sobre educación en informática - SIGCSE '91 . Vol. 23. págs. 130–139 . doi : 10.1145/107004.107029 . ISBN 0897913779. S2CID 16648394 .
- ↑ "/home/usr/bk/glide/docs2.3.1/GLIDEPGM.DOC" . Gamers.org . Consultado el 14 de julio de 2017 .
- 1 2 "OpenEXR" . OpenEXR. Archivado del original el 8 de mayo de 2013. Recuperado el 14 de julio de 2017 .
- ↑ Mark S. Peercy; Marc Olano; John Airey; P. Jeffrey Ungar. "Sombreado programable interactivo de múltiples pasadas" (PDF) . People.csail.mit.edu . Consultado el 14 de julio de 2017 .
- ↑ "Patente US7518615 - Sistema de visualización con rasterización de punto flotante y punto flotante ... - Patentes de Google" . Google.com . Consultado el 14 de julio de 2017 .
- ↑ "vs_2_sw" . Documentación del kit de herramientas Cg 3.1 . Nvidia . Consultado el 17 de agosto de 2016 .
- 1 2 Norma IEEE para aritmética de punto flotante . IEEE STD 754-2019 (Revisión de IEEE 754-2008). Julio de 2019. págs. 1–84 . doi : 10.1109/ieeestd.2019.8766229 . ISBN 978-1-5044-5924-2.
- ↑ "Compatibilidad con números de coma flotante de precisión media" . Guía del usuario del compilador de RealView Compilation Tools . 10 de diciembre de 2010. Consultado el 5 de mayo de 2015 .
- ↑ Garrard, Andrew. "10.1. Números de punto flotante de 16 bits" . Especificación del formato de datos de Khronos v1.2 rev 1. Khronos . Consultado el 5 de agosto de 2023 .
- ↑ "KHR_mesh_quantization" . GitHub . Grupo Khronos . Consultado el 2 de julio de 2023 .
- ↑ Daria Soboleva (30-01-2023). "¿Bfloat o no Bfloat? ¡Esa es la cuestión!" . Archivado del original el 15-08-2025 . Recuperado el 13-04-2026 .
El formato de datos bfloat16 puede acortar el tiempo necesario para entrenar modelos de aprendizaje profundo de estilo GPT, al tiempo que conserva la precisión del modelo en tareas posteriores. [...] bfloat16 tiene un rango dinámico mayor (número de bits del exponente) que float16, que es idéntico a float32.
- ↑ Ho, Nhut-Minh; Wong, Weng-Fai (1 de septiembre de 2017). "Aprovechamiento de la aritmética de precisión media en las GPU de Nvidia" (PDF) . Departamento de Ciencias de la Computación, Universidad Nacional de Singapur . Recuperado el 13 de julio de 2020.
Nvidia introdujo recientemente soporte nativo para punto flotante de precisión media (FP16) en sus GPU Pascal. Esto se motivó principalmente por la posibilidad de que esto acelerará las aplicaciones intensivas en datos y tolerantes a errores en las GPU.
- ↑ "Floats" . ziglang.org . Consultado el 7 de enero de 2024 .
- ↑ "Tipos básicos" . odin-lang.org . Consultado el 22 de marzo de 2026 .
- ↑ "Half Struct (System)" . learn.microsoft.com . Consultado el 1 de febrero de 2024 .
- ↑ Govindarajan, Prashanth (31 de agosto de 2020). "¡Presentamos el tipo Half!" . Blog de .NET . Consultado el 1 de febrero de 2024 .
- ↑ "Tipos numéricos de punto flotante ― Referencia de C#" . learn.microsoft.com . 29/09/2022 . Consultado el 01/02/2024 .
- ↑ "Literales ― Referencia del lenguaje F#" . learn.microsoft.com . 15 de junio de 2022. Consultado el 1 de febrero de 2024 .
- ↑ "Resumen de tipos de datos: referencia del lenguaje Visual Basic" . learn.microsoft.com . 15 de septiembre de 2021. Consultado el 1 de febrero de 2024 .
- ↑ "swift-evolution/proposals/0277-float16.md en main · apple/swift-evolution" . github.com . Consultado el 13 de mayo de 2024 .
- ↑ "extensión cl_khr_fp16" . registry.khronos.org . Consultado el 31 de mayo de 2024 .
- ↑ Cross, Travis. "Seguimiento de un problema con los tipos de punto flotante f16 y f128" . GitHub . Consultado el 5 de julio de 2024 .
- ↑ "Números enteros y de punto flotante · El lenguaje Julia" . docs.julialang.org . Consultado el 11 de julio de 2024 .
- ↑ "P1467R9: Tipos de punto flotante extendidos y nombres estándar" . www.open-std.org . Consultado el 18 de octubre de 2024 .
- ↑ "106652 – [ C++23 ] P1467 - Tipos de punto flotante extendidos y nombres estándar" . gcc.gnu.org . Consultado el 18 de octubre de 2024 .
- ↑ "Formato de números de punto flotante de precisión media" . Guía de referencia del compilador ARM armclang, versión 6.7 . ARM Developer . Consultado el 13 de mayo de 2022 .
- ↑ Towner, Daniel. "Extensiones vectoriales avanzadas Intel® 512 - Conjunto de instrucciones FP16 para productos basados en procesadores Intel® Xeon®" (PDF) . Programas Intel® Builders . Consultado el 13 de mayo de 2022 .
- ↑ "Manual del conjunto de instrucciones RISC-V, volumen I: ISA de nivel de usuario RISC-V" . Five EmbedDev . Consultado el 2 de julio de 2023 .
- ↑ "OPF_PowerISA_v3.1B.pdf" . Archivos OpenPOWER . Fundación OpenPOWER . Consultado el 2 de julio de 2023 .
- ↑ "ls005.xlen.mdwn" . libre-soc.org Git . Consultado el 2 de julio de 2023 .
Lecturas adicionales
- Formato de punto flotante firmado de 16 bits de Khronos Vulkan
Enlaces externos
- Minifloats (en Panorama general de los formatos de punto flotante )
- Sitio OpenEXR
- Aritmética binaria
- tipos de punto flotante de 16 bits