El formato de punto flotante de precisión simple (a veces llamado FP32 , float32 o float ) es un formato numérico informático que normalmente ocupa 32 bits en la memoria del ordenador ; representa una amplia gama de valores numéricos mediante el uso de un punto de base flotante .
Una variable de punto flotante puede representar un rango más amplio de números que una variable de punto fijo del mismo ancho de bits, a costa de la precisión. Una variable entera con signo de 32 bits tiene un valor máximo de 2³¹ − 1 = 2.147.483.647, mientras que una variable de punto flotante de base 2 de 32 bits IEEE 754 tiene un valor finito máximo de (2 − 2 −23 ) × 2¹²⁷ ≈ 3,4028235 × 10³⁸ . Todos los enteros con siete o menos dígitos decimales, y cualquier 2ⁿ para un número entero −149 ≤ n ≤ 127, se pueden convertir exactamente en un valor de punto flotante de precisión simple IEEE 754.
En el estándar IEEE 754 , el formato de 32 bits en base 2 se denomina oficialmente binary32 ; en IEEE 754-1985 se le llamaba single . IEEE 754 especifica tipos de punto flotante adicionales, como la doble precisión en base 2 de 64 bits y, más recientemente, las representaciones en base 10.
Fortran fue uno de los primeros lenguajes de programación en ofrecer tipos de datos de punto flotante de precisión simple y doble . Antes de la adopción generalizada de la norma IEEE 754-1985, la representación y las propiedades de los tipos de datos de punto flotante dependían del fabricante y el modelo del ordenador, así como de las decisiones de los diseñadores del lenguaje de programación. Por ejemplo, el tipo de datos de precisión simple de GW-BASIC era el formato de punto flotante MBF de 32 bits .
La precisión simple se denomina SINGLE-FLOAT en Common Lisp ; [ 1 ] float binary(p) con p ≤ 21, float decimal(p) con el valor máximo de p dependiendo de si se aplica el atributo DFP (IEEE 754 DFP), en PL/I; float en C con soporte IEEE 754, C++ (si está en C), C# y Java ; [ 2 ] Float en Haskell [ 3 ] y Swift ; [ 4 ] y Single en Object Pascal ( Delphi ), Visual Basic y MATLAB . Sin embargo, float en Python , Ruby , PHP y OCaml y single en versiones de Octave anteriores a 3.2 se refieren a números de doble precisión . En la mayoría de las implementaciones de PostScript y algunos sistemas embebidos , la única precisión admitida es simple.
Estándar IEEE 754: binary32
El estándar IEEE 754 especifica que un binary32 tiene:
- Bit de signo : 1 bit
- Ancho del exponente : 8 bits
- Precisión significativa : 24 bits (23 almacenados explícitamente)
Esto proporciona una precisión de entre 6 y 9 dígitos decimales significativos . Si una cadena decimal con un máximo de 6 dígitos significativos se convierte al formato de precisión simple IEEE 754, dando como resultado un número normal , y luego se vuelve a convertir a una cadena decimal con el mismo número de dígitos, el resultado final debería coincidir con la cadena original. Si un número de precisión simple IEEE 754 se convierte a una cadena decimal con al menos 9 dígitos significativos, y luego se vuelve a convertir a la representación de precisión simple, el resultado final debe coincidir con el número original. [ 5 ]
El bit de signo determina el signo del número, que también es el signo de la mantisa. "1" significa negativo. El campo del exponente es un entero sin signo de 8 bits de 0 a 255, en forma sesgada : un valor de 127 representa el exponente cero real. Los exponentes van de −126 a +127 (por lo tanto, de 1 a 254 en el campo del exponente), porque los valores de exponente sesgados 0 (todos 0) y 255 (todos 1) están reservados para números especiales ( números subnormales , ceros con signo , infinitos y NaN ).
La verdadera mantisa de los números normales incluye 23 bits fraccionarios a la derecha del punto binario y un bit principal implícito (a la izquierda del punto binario) con valor 1. Los números subnormales y los ceros (que son los números de punto flotante de menor magnitud que el número normal positivo más pequeño) se representan con el exponente sesgado 0, lo que da al bit principal implícito el valor 0. Por lo tanto, solo aparecen 23 bits fraccionarios de la mantisa en el formato de memoria, pero la precisión total es de 24 bits (equivalente a log 10 (2 24 ) ≈ 7,225 dígitos decimales) para los valores normales; los subnormales tienen una precisión que se degrada gradualmente hasta 1 bit para el valor distinto de cero más pequeño.
Las piezas están dispuestas de la siguiente manera:
![]()
El valor real asumido por un dato binario32 de 32 bits dado con un signo dado , un exponente sesgado E (el entero sin signo de 8 bits) y una fracción de 23 bits es
- ,
lo cual produce
En este ejemplo:
- ,
- ,
- ,
- ,
- .
de este modo:
- .
Nota:
- ,
- ,
- ,
- .
Codificación exponencial
El exponente binario de punto flotante de precisión simple se codifica utilizando una representación binaria con desplazamiento , donde el desplazamiento cero es 127; también conocido como sesgo del exponente en el estándar IEEE 754.
- E min = 01 H −7F H = −126
- E max = FE H −7F H = 127
- Sesgo del exponente = 7F H = 127
Por lo tanto, para obtener el verdadero exponente según lo define la representación binaria con desplazamiento, se debe restar el desplazamiento de 127 del exponente almacenado.
Los exponentes almacenados 00 H y FF H se interpretan de forma especial.
El valor normal positivo mínimo esy el valor positivo mínimo (subnormal) es.
Conversión de decimal a binario32
En general, consulte la norma IEEE 754 para la conversión estricta (incluido el redondeo) de un número real a su formato binario de 32 bits equivalente.
Aquí podemos mostrar cómo convertir un número real en base 10 a un formato binario IEEE 754 de 32 bits utilizando el siguiente esquema:
- Consideremos un número real con una parte entera y una parte fraccionaria, como por ejemplo 12.375.
- Convierta y normalice la parte entera a binario.
- Convierta la parte fraccionaria utilizando la siguiente técnica, como se muestra aquí.
- Suma los dos resultados y ajústalos para obtener una conversión final adecuada.
Conversión de la parte fraccionaria: Consideremos 0,375, la parte fraccionaria de 12,375. Para convertirla en una fracción binaria, multiplique la fracción por 2, tome la parte entera y repita el proceso con la nueva fracción por 2 hasta encontrar una fracción igual a cero o hasta alcanzar el límite de precisión, que es de 23 dígitos fraccionarios para el formato binario IEEE 754 de 32 dígitos.
- La parte entera representa el dígito de la fracción binaria. Vuelva a multiplicar 0.750 por 2 para continuar.
- , fracción = 0,011, terminar
Vemos quese puede representar exactamente en binario comoNo todas las fracciones decimales pueden representarse en una fracción binaria de dígitos finitos. Por ejemplo, el decimal 0.1 no puede representarse en binario de forma exacta, solo aproximada. Por lo tanto:
Dado que el formato binario IEEE 754 de 32 bits requiere que los valores reales se representen enformato (ver Número normalizado , Número desnormalizado ), 1100.011 se desplaza a la derecha 3 dígitos para convertirse en
Finalmente podemos ver que:
De lo cual deducimos:
- El exponente es 3 (y en la forma sesgada es, por lo tanto,)
- La fracción es 100011 (mirando a la derecha del punto binario).
A partir de estos podemos formar la representación resultante en formato binario IEEE 754 de 32 bits de 12.375:
Nota: considere convertir 68.123 al formato binario IEEE 754 de 32 bits: Usando el procedimiento anterior, espera obtenercon los últimos 4 bits siendo 1001. Sin embargo, debido al comportamiento de redondeo predeterminado del formato IEEE 754, lo que se obtiene es, cuyos últimos 4 bits son 1010.
Ejemplo 1: Consideremos el decimal 1. Podemos ver que:
De lo cual deducimos:
- El exponente es 0 (y en la forma sesgada es, por lo tanto,
- La fracción es 0 (mirando a la derecha del punto binario en 1.0 es todo))
A partir de estos podemos formar la representación resultante en formato binario IEEE 754 de 32 bits del número real 1:
Ejemplo 2: Consideremos un valor de 0,25. Podemos observar que:
De lo cual deducimos:
- El exponente es −2 (y en la forma sesgada es)
- La fracción es 0 (si miramos a la derecha del punto binario en 1.0, todo son ceros).
A partir de estos podemos formar la representación resultante en formato binario IEEE 754 de 32 bits del número real 0,25:
Ejemplo 3: Consideremos un valor de 0,375. Vimos que
Por lo tanto, después de determinar una representación de 0.375 comoPodemos proceder como se indicó anteriormente:
- El exponente es −2 (y en la forma sesgada es)
- La fracción es 1 (mirando a la derecha del punto binario en 1.1 es un solo)
A partir de estos podemos formar la representación resultante en formato binario IEEE 754 de 32 bits del número real 0,375:
Conversión de binary32 a decimal
Si el valor binary32, 41C80000 en este ejemplo, está en hexadecimal, primero lo convertimos a binario:
Luego lo dividimos en tres partes: bit de signo, exponente y mantisa.
- Bit de signo:
- Exponente:
- Importancia:
Luego agregamos el bit 24 implícito a la mantisa:
- Importancia:
y decodifica el valor del exponente restando 127:
- Exponente bruto:
- Exponente decodificado:
Cada uno de los 24 bits de la mantisa (incluido el bit 24 implícito), del bit 23 al bit 0, representa un valor, que comienza en 1 y se divide a la mitad para cada bit, de la siguiente manera:
bit 23 = 1 bit 22 = 0,5 bit 21 = 0,25 bit 20 = 0,125 bit 19 = 0,0625 bit 18 = 0,03125 bit 17 = 0,015625 . . bit 6 = 0,00000762939453125 bit 5 = 0,000003814697265625 bit 4 = 0,0000019073486328125 bit 3 = 0,00000095367431640625 bit 2 = 0,000000476837158203125 bit 1 = 0,0000002384185791015625 bit 0 = 0,00000011920928955078125
En este ejemplo, la mantisa tiene tres bits activados: el bit 23, el bit 22 y el bit 19. Ahora podemos decodificar la mantisa sumando los valores representados por estos bits.
- Significando decodificado:
Luego debemos multiplicar por la base, 2, elevado a la potencia del exponente, para obtener el resultado final:
De este modo
Esto es equivalente a:
donde s es el bit de signo, x es el exponente y m es la mantisa.
Limitaciones de precisión en valores decimales (entre 1 y 16777216)
- Decimales entre 1 y 2: intervalo fijo 2 −23 (1+2 −23 es el siguiente número flotante más grande después de 1)
- Decimales entre 2 y 4: intervalo fijo 2 −22
- Decimales entre 4 y 8: intervalo fijo 2 −21
- ...
- Decimales entre 2 n y 2 n+1 : intervalo fijo 2 n−23
- ...
- Decimales entre 2 22 =4,194,304 y 2 23 =8,388,608: intervalo fijo 2 −1 =0.5
- Decimales entre 2 23 =8,388,608 y 2 24 =16,777,216: intervalo fijo 2 0 =1
Limitaciones de precisión en valores enteros
- Los números enteros entre -16.777.216 y 16.777.216 (incluido el 0) se pueden representar con exactitud.
- Los números enteros entre 2²⁴ = 16.777.216 y 2²⁵ = 33.554.432 se redondean al múltiplo de 2 (número par).
- Los números enteros entre 2²⁵ y 2²⁶ se redondean a un múltiplo de 4.
- ...
- Los números enteros entre 2n y 2n +1 se redondean a un múltiplo de 2n−23.
- ...
- Los números enteros entre 2¹²⁷ y 2¹²⁸ se redondean a un múltiplo de 2¹⁰⁴.
- Los números enteros mayores o iguales a 2¹²⁸ se redondean al infinito.
Casos notables de precisión simple
Estos ejemplos se presentan en representación de bits , en hexadecimal y binario , del valor de punto flotante. Esto incluye el signo, el exponente (sesgado) y la mantisa.
Por defecto, 1/3 se redondea hacia arriba, en lugar de hacia abajo como la doble precisión , debido al número par de bits en la mantisa. Los bits de 1/3 más allá del punto de redondeo son 1010...que es más de 1/2 de una unidad en el último lugar .
Las codificaciones de qNaN y sNaN no están especificadas en IEEE 754 y se implementan de manera diferente en distintos procesadores. Los procesadores de la familia x86 y ARM utilizan el bit más significativo del campo mantisa para indicar un NaN silencioso . Los procesadores PA-RISC utilizan el bit para indicar un NaN de señalización .
Optimizaciones
El diseño del formato de punto flotante permite diversas optimizaciones, gracias a la fácil generación de una aproximación logarítmica en base 2 a partir de una representación entera del patrón de bits original. La aritmética entera y el desplazamiento de bits pueden proporcionar una aproximación a la raíz cuadrada recíproca ( raíz cuadrada inversa rápida ), comúnmente requerida en gráficos por computadora .
Véase también
- ISO/IEC 10967 , aritmética independiente del idioma
- Formato de punto flotante de doble precisión
- Tipo de datos primitivo
- Estabilidad numérica
- Notación científica
Referencias
- ↑ "CLHS: Tipo SHORT-FLOAT, SINGLE-FLOAT, DOUBLE-FLOAT..." www.lispworks.com .
- ↑ "Tipos de datos primitivos" . Documentación de Java .
- ↑ "6 tipos y clases predefinidos" . haskell.org . 20 de julio de 2010.
- ↑ "Flotar" . Documentación para desarrolladores de Apple .
- ↑ William Kahan (1 de octubre de 1997). "Notas de clase sobre el estado de la norma IEEE 754 para aritmética binaria de punto flotante" (PDF) . pág. 4. Archivado del original (PDF) el 8 de febrero de 2012.
Enlaces externos
- Editor de patrones de bits de punto flotante en tiempo real
- Calculadora en línea
- Convertidor en línea para números IEEE 754 con precisión simple.
- Código fuente en C para convertir entre precisión doble, simple y media IEEE.
- Aritmética binaria
- aritmética informática
- Tipos de punto flotante