En informática , los minifloats son valores de punto flotante representados con muy pocos bits . Como era de esperar, no son adecuados para cálculos numéricos de uso general. Se utilizan para fines especiales, con mayor frecuencia en gráficos por computadora, donde las iteraciones son pequeñas y la precisión tiene efectos estéticos. [ cita requerida ] El aprendizaje automático también usa formatos similares como bfloat16 . Además, se encuentran con frecuencia como una herramienta pedagógica en los cursos de informática para demostrar las propiedades y estructuras de la aritmética de punto flotante y los números IEEE 754 .
Los minifloats con 16 bits son números de precisión media (a diferencia de precisión simple y doble ). También hay minifloats de 8 bits o incluso menos.
Los minifloat pueden diseñarse siguiendo los principios del estándar IEEE 754 . En este caso, deben obedecer las reglas (no escritas explícitamente) para la frontera entre números normales y subnormales y deben tener patrones especiales para infinito y NaN . Los números normalizados se almacenan con un exponente sesgado . La nueva revisión del estándar, IEEE 754-2008 , tiene minifloat binarios de 16 bits .
Las GPU Radeon R300 y R420 utilizaron un formato de punto flotante "fp24" con 7 bits de exponente y 16 bits (+1 implícito) de mantisa. [1] "Precisión total" en Direct3D 9.0 es un formato patentado de punto flotante de 24 bits. La API de gráficos D3D9 (Shader Model 2.0) de Microsoft inicialmente admitía FP24 (como en el chip R300 de ATI) y FP32 (como en el chip NV30 de Nvidia) como "Precisión total", así como FP16 como "Precisión parcial" para cálculos de sombreado de vértices y píxeles. realizado por el hardware de gráficos.
Notación
Un minifloat generalmente se describe usando una tupla de cuatro números, ( S , E , M , B ):
- S es la longitud del campo del signo. Suele ser 0 o 1.
- E es la longitud del campo exponente.
- M es la longitud del campo de mantisa (significando).
- B es el sesgo del exponente .
Un formato minifloat denotado por ( S , E , M , B ) tiene, por tanto, S + E + M bits de longitud.
En gráficos por computadora, los minifloats se utilizan a veces para representar solo valores integrales. Si al mismo tiempo existieran valores subnormales, el menor número subnormal tiene que ser 1. El valor de sesgo sería B = E - M - 1 en este caso, asumiendo que se usan dos valores de exponentes especiales por IEEE.
La notación ( S , E , M , B ) se puede convertir a un formato ( B , P , L , U ) como (2, M + 1, B + 1, 2 S - B ) (con el uso de exponentes IEEE) .
Ejemplo
firmar | exponente | significando | |||||
---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
En este ejemplo, un minifloat de 1 byte (8 bits) con 1 bit de signo, 4 bits de exponente y 3 bits de significado (en resumen, un minifloat 1.4.3. − 2) se utiliza para representar valores integrales. Todos los principios de IEEE 754 deben ser válidos. El único valor libre es el sesgo del exponente , que definimos como -2 para los números enteros. El exponente desconocido se llama para el momento x .
Los números en una base diferente se marcan como ... base , por ejemplo, 101 2 = 5. Los patrones de bits tienen espacios para visualizar sus partes.
Representación de cero
0 0000 000 = 0
Números subnormales
El significado se amplía con "0":
0 0000001 = 0,001 2 × 2 x = 0,125 × 2 x = 1 (número mínimo anormal)...0 0000111 = 0.111 2 × 2 x = 0.875 × 2 x = 7 (mayor número subnormal)
Números normalizados
El significado se amplía con "1":
0 0001000 = 1.000 2 × 2 x = 1 × 2 x = 8 (número mínimo normalizado)0 0001001 = 1,001 2 × 2 x = 1,125 × 2 x = 9...0 0010000 = 1.000 2 × 2 x +1 = 1 × 2 x +1 = 160 00100001 = 1.001 2 × 2 x +1 = 1.125 × 2 x +1 = 18...0 1110000 = 1.000 2 × 2 x +13 = 1.000 × 2 x +13 = 655360 111001 = 1,001 2 × 2 x +13 = 1,125 × 2 x +13 = 73728...0 1110110 = 1,110 2 × 2 x +13 = 1,750 × 2 x +13 = 1146880 1110111 = 1,111 2 × 2 x +13 = 1,875 × 2 x +13 = 122880 (mayor número normalizado)
infinito
0 1111 000 = + infinito1 1111 000 = −infinito
Si el campo exponente no se tratara de forma especial, el valor sería
0 1111 000 = 1.000 2 × 2 x +14 = 2 17 = 131072
No un número
x 1111 yyy = NaN (si yyy ≠ 000)
Sin el manejo especial IEEE 754 del mayor exponente, el mayor valor posible sería
0 1111111 = 1,111 2 × 2 x +14 = 1,875 × 2 17 = 245760
Valor del sesgo
Si el valor mínimo por debajo de lo normal (segunda línea arriba) debe ser 1 [ cita requerida ] , el valor de x tiene que ser x = 3. Por lo tanto, el sesgo debe ser −2 [ cita requerida ] ; es decir, cada exponente almacenado debe reducirse en −2 o aumentarse en 2, para obtener el exponente numérico.
Todos los valores como decimales
Este es un gráfico de todos los valores posibles cuando se trata el flotador de manera similar a un flotador IEEE.
... 000 | ... 001 | ... 010 | ... 011 | ... 100 | ... 101 | ... 110 | ... 111 | |
---|---|---|---|---|---|---|---|---|
0 0000 ... | 0 | 0,125 | 0,25 | 0.375 | 0,5 | 0,625 | 0,75 | 0,875 |
0 0001 ... | 1 | 1.125 | 1,25 | 1.375 | 1,5 | 1.625 | 1,75 | 1.875 |
0 0010 ... | 2 | 2,25 | 2.5 | 2,75 | 3 | 3,25 | 3,5 | 3,75 |
0 0011 ... | 4 | 4.5 | 5 | 5.5 | 6 | 6.5 | 7 | 7.5 |
0 0100 ... | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
0 0101 ... | dieciséis | 18 | 20 | 22 | 24 | 26 | 28 | 30 |
0 0110 ... | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 |
0 0111 ... | 64 | 72 | 80 | 88 | 96 | 104 | 112 | 120 |
0 1000 ... | 128 | 144 | 160 | 176 | 192 | 208 | 224 | 240 |
0 1001 ... | 256 | 288 | 320 | 352 | 384 | 416 | 448 | 480 |
0 1010 ... | 512 | 576 | 640 | 704 | 768 | 832 | 896 | 960 |
0 1011 ... | 1024 | 1152 | 1280 | 1408 | 1536 | 1664 | 1792 | 1920 |
0 1100 ... | 2048 | 2304 | 2560 | 2816 | 3072 | 3328 | 3584 | 3840 |
0 1101 ... | 4096 | 4608 | 5120 | 5632 | 6144 | 6656 | 7168 | 7680 |
0 1110 ... | 8192 | 9216 | 10240 | 11264 | 12288 | 13312 | 14336 | 15360 |
0 1111 ... | Inf | Yaya | Yaya | Yaya | Yaya | Yaya | Yaya | Yaya |
1 0000 ... | -0 | -0,125 | -0,25 | -0,375 | -0,5 | -0,625 | -0,75 | -0,875 |
1 0001 ... | -1 | -1,125 | -1.25 | -1,375 | -1,5 | -1,625 | -1,75 | -1.875 |
1 0010 ... | -2 | -2,25 | -2,5 | -2,75 | -3 | -3,25 | -3,5 | -3,75 |
1 0011 ... | -4 | -4,5 | -5 | -5,5 | -6 | -6,5 | -7 | -7,5 |
1 0100 ... | −8 | −9 | −10 | −11 | −12 | −13 | −14 | −15 |
1 0101 ... | −16 | −18 | −20 | −22 | −24 | −26 | −28 | −30 |
1 0110 ... | −32 | −36 | −40 | −44 | −48 | −52 | −56 | −60 |
1 0111 ... | −64 | −72 | −80 | −88 | −96 | −104 | −112 | −120 |
1 1000 ... | −128 | −144 | −160 | −176 | −192 | −208 | −224 | −240 |
1 1001 ... | −256 | −288 | −320 | −352 | −384 | −416 | −448 | −480 |
1 1010 ... | −512 | −576 | −640 | −704 | −768 | −832 | −896 | −960 |
1 1011 ... | −1024 | −1152 | −1280 | −1408 | −1536 | −1664 | −1792 | −1920 |
1 1100 ... | −2048 | −2304 | −2560 | −2816 | −3072 | −3328 | −3584 | −3840 |
1 1101 ... | −4096 | −4608 | −5120 | −5632 | −6144 | −6656 | −7168 | −7680 |
1 1110 ... | −8192 | −9216 | −10240 | −11264 | −12288 | −13312 | −14336 | −15360 |
1 1111 ... | −Inf | Yaya | Yaya | Yaya | Yaya | Yaya | Yaya | Yaya |
Todos los valores como números enteros
Debido a la gran falta de precisión con los flotantes de 8 bits, se sugiere que solo los use escalados a valores enteros.
... 000 | ... 001 | ... 010 | ... 011 | ... 100 | ... 101 | ... 110 | ... 111 | |
---|---|---|---|---|---|---|---|---|
0 0000 ... | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
0 0001 ... | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
0 0010 ... | dieciséis | 18 | 20 | 22 | 24 | 26 | 28 | 30 |
0 0011 ... | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 |
0 0100 ... | 64 | 72 | 80 | 88 | 96 | 104 | 112 | 120 |
0 0101 ... | 128 | 144 | 160 | 176 | 192 | 208 | 224 | 240 |
0 0110 ... | 256 | 288 | 320 | 352 | 384 | 416 | 448 | 480 |
0 0111 ... | 512 | 576 | 640 | 704 | 768 | 832 | 896 | 960 |
0 1000 ... | 1024 | 1152 | 1280 | 1408 | 1536 | 1664 | 1792 | 1920 |
0 1001 ... | 2048 | 2304 | 2560 | 2816 | 3072 | 3328 | 3584 | 3840 |
0 1010 ... | 4096 | 4608 | 5120 | 5632 | 6144 | 6656 | 7168 | 7680 |
0 1011 ... | 8192 | 9216 | 10240 | 11264 | 12288 | 13312 | 14336 | 15360 |
0 1100 ... | 16384 | 18432 | 20480 | 22528 | 24576 | 26624 | 28672 | 30720 |
0 1101 ... | 32768 | 36864 | 40960 | 45056 | 49152 | 53248 | 57344 | 61440 |
0 1110 ... | 65536 | 73728 | 81920 | 90112 | 98304 | 106496 | 114688 | 122880 |
0 1111 ... | Inf | Yaya | Yaya | Yaya | Yaya | Yaya | Yaya | Yaya |
1 0000 ... | −0 | −1 | −2 | −3 | −4 | −5 | −6 | −7 |
1 0001 ... | −8 | −9 | −10 | −11 | −12 | −13 | −14 | −15 |
1 0010 ... | −16 | −18 | −20 | −22 | −24 | −26 | −28 | −30 |
1 0011 ... | −32 | −36 | −40 | −44 | −48 | −52 | −56 | −60 |
1 0100 ... | −64 | −72 | −80 | −88 | −96 | −104 | −112 | −120 |
1 0101 ... | −128 | −144 | −160 | −176 | −192 | −208 | −224 | −240 |
1 0110 ... | −256 | −288 | −320 | −352 | −384 | −416 | −448 | −480 |
1 0111 ... | −512 | −576 | −640 | −704 | −768 | −832 | −896 | −960 |
1 1000 ... | −1024 | −1152 | −1280 | −1408 | −1536 | −1664 | −1792 | −1920 |
1 1001 ... | −2048 | −2304 | −2560 | −2816 | −3072 | −3328 | −3584 | −3840 |
1 1010 ... | −4096 | −4608 | −5120 | −5632 | −6144 | −6656 | −7168 | −7680 |
1 1011 ... | −8192 | −9216 | −10240 | −11264 | −12288 | −13312 | −14336 | −15360 |
1 1100 ... | −16384 | −18432 | −20480 | −22528 | −24576 | −26624 | −28672 | −30720 |
1 1101 ... | −32768 | −36864 | −40960 | −45056 | −49152 | −53248 | −57344 | −61440 |
1 1110 ... | −65536 | −73728 | −81920 | −90112 | −98304 | −106496 | −114688 | −122880 |
1 1111 ... | −Inf | Yaya | Yaya | Yaya | Yaya | Yaya | Yaya | Yaya |
Sin embargo, en la práctica, los flotadores no se muestran exactamente. [ cita requerida ] En cambio, están redondeados; por ejemplo, si un flotador tiene alrededor de 3 dígitos significativos y se representa el número 8192, se redondeará a 8190 para evitar una precisión falsa ; de lo contrario, un número como 1000000 convertido a dicho flotador y viceversa se mostraría confusamente como, por ejemplo , 1000448. [ cita requerida ]
Propiedades de este ejemplo
Los miniflotantes integrales en 1 byte tienen un rango mayor de ± 122880 que el entero en complemento a dos con un rango de −128 a +127. El mayor rango se compensa con una precisión pobre, porque solo hay 4 bits de mantisa, lo que equivale a algo más de un decimal. También tienen mayor alcance que los minifloats de precisión media con rango ± 65 504, también compensado por falta de fracciones y poca precisión.
Solo hay 242 valores diferentes (si +0 y −0 se consideran diferentes), porque 14 de los patrones de bits representan NaN.
Los valores entre 0 y 16 tienen el mismo patrón de bits que el minifloat o el entero en complemento a dos. El primer patrón con un valor diferente es 00010001, que es 18 como minifloat y 17 como un entero en complemento a dos.
Esta coincidencia no ocurre en absoluto con valores negativos, porque este minifloat es un formato de magnitud con signo.
La línea real (vertical) de la derecha muestra claramente la densidad variable de los valores de punto flotante, una propiedad que es común a cualquier sistema de punto flotante. Esta densidad variable da como resultado una curva similar a la función exponencial.
Aunque la curva puede parecer suave, este no es el caso. En realidad, el gráfico consta de puntos distintos, y estos puntos se encuentran en segmentos de línea con pendientes discretas. El valor de los bits de exponente determina la precisión absoluta de los bits de mantisa, y es esta precisión la que determina la pendiente de cada segmento lineal.
Aritmética
Adición
El gráfico demuestra la adición de minifloats aún más pequeños (1.3.2.3) con 6 bits. Este sistema de punto flotante sigue exactamente las reglas de IEEE 754. NaN como operando produce siempre resultados NaN. Inf - Inf y (−Inf) + Inf también dan como resultado NaN (área verde). Inf se puede aumentar y disminuir mediante valores finitos sin cambios. Las sumas con operandos finitos pueden dar un resultado infinito (es decir, 14.0 + 3.0 = + Inf como resultado es el área cian, −Inf es el área magenta). El rango de los operandos finitos se rellena con las curvas x + y = c , donde c es siempre uno de los valores flotantes representables (azul y rojo para resultados positivos y negativos respectivamente).
Resta, multiplicación y división
Las otras operaciones aritméticas se pueden ilustrar de manera similar:
Sustracción
Multiplicación
División
En dispositivos integrados
Los minifloats también se usan comúnmente en dispositivos integrados, especialmente en microcontroladores donde el punto flotante deberá emularse en el software de todos modos. Para acelerar el cálculo, la mantisa suele ocupar exactamente la mitad de los bits, por lo que el límite del registro se dirige automáticamente a las partes sin desplazarse.
Ver también
Referencias
- ^ Buck, Ian (13 de marzo de 2005), "Capítulo 32. Dar el paso en la informática GPU" , en Pharr, Matt (ed.), GPU Gems , ISBN 0-321-33559-7, consultado el 5 de abril de 2018.
- Munafo, Robert (15 de mayo de 2016). "Estudio de formatos de coma flotante" . Consultado el 8 de agosto de 2016 .