El formato de punto flotante de precisión simple (a veces llamado FP32 o float32 ) es un formato de número de computadora , que generalmente ocupa 32 bits en la memoria de la computadora ; representa un amplio rango dinámico de valores numéricos mediante el uso de un punto de base flotante .
Una variable de coma flotante puede representar un rango de números más amplio que una variable de coma fija del mismo ancho de bits a costa de la precisión. A firmado 32 bits número entero variable tiene un valor máximo de 2 31 - 1 = 2147483647, mientras que un 754 IEEE variable de punto flotante en base 2 de 32 bits tiene un valor máximo de (2 - 2 -23 ) x 2 127 ≈ 3,4028235 × 10 38 . Todos los enteros con 7 o menos dígitos decimales, y cualquier 2 n 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-2008 , el formato base 2 de 32 bits se denomina oficialmente binary32 ; se llamó single en IEEE 754-1985 . IEEE 754 especifica tipos de punto flotante adicionales, como doble precisión base 2 de 64 bits y, más recientemente, representaciones base 10.
Uno de los primeros lenguajes de programación en proporcionar tipos de datos de punto flotante de precisión simple y doble fue Fortran . Antes de la adopción generalizada de IEEE 754-1985, la representación y las propiedades de los tipos de datos de punto flotante dependían del fabricante y el modelo de la computadora, y de las decisiones tomadas por los diseñadores de lenguajes de programación. Por ejemplo, el tipo de datos de precisión simple de GW-BASIC era el formato de coma flotante MBF de 32 bits .
La precisión simple se denomina REAL en Fortran , [1] SINGLE-FLOAT en Common Lisp , [2] float en C , C ++ , C # , Java , [3] Float en Haskell , [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 integrados , la única precisión admitida es simple.
Formato de coma flotante binario de precisión simple IEEE 754: binary32
El estándar IEEE 754 especifica que un binary32 tiene:
- Bit de signo : 1 bit
- Ancho de exponente : 8 bits
- Precisión significativa : 24 bits (23 almacenados explícitamente)
Esto da una precisión de 6 a 9 dígitos decimales significativos . Si una cadena decimal con un máximo de 6 dígitos significativos se convierte a una representación de precisión simple IEEE 754 y luego se vuelve a convertir a una cadena decimal con el mismo número de dígitos, el resultado final debe coincidir con la cadena original. Si un número de precisión simple IEEE 754 se convierte en una cadena decimal con al menos 9 dígitos significativos y luego se vuelve a convertir a una 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 del significando. El exponente es un entero sin signo de 8 bits de 0 a 255, en forma sesgada : un valor de exponente de 127 representa el cero real. Los exponentes van de −126 a +127 porque los exponentes de −127 (todos 0) y +128 (todos 1) están reservados para números especiales.
El verdadero significado incluye 23 bits de fracción a la derecha del punto binario y un bit principal implícito (a la izquierda del punto binario) con valor 1, a menos que el exponente se almacene con todos los ceros. Por lo tanto, solo aparecen 23 bits de fracción del significado 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). Los bits se distribuyen de la siguiente manera:
El valor real asumido por un dato binario32 de 32 bits dado con un signo dado , exponente sesgado e (el entero sin signo de 8 bits) y una fracción de 23 bits es
- ,
cuyos rendimientos
En este ejemplo:
- ,
- ,
- ,
- ,
- .
por lo tanto:
- .
Nota:
- ,
- ,
- ,
- .
Codificación de exponentes
El exponente de coma flotante binario de precisión simple se codifica utilizando una representación binaria de compensación , siendo la compensación cero 127; también conocido como sesgo de exponente en el estándar IEEE 754.
- E min = 01 H −7F H = −126
- E máx = FE H −7F H = 127
- Sesgo de exponente = 7F H = 127
Por lo tanto, para obtener el verdadero exponente definido por la representación binaria de compensación, la compensación de 127 debe restarse del exponente almacenado.
Los exponentes almacenados 00 H y FF H se interpretan especialmente.
Exponente | fracción = 0 | fracción ≠ 0 | Ecuación |
---|---|---|---|
00 H | cero | número subnormal | |
01 H , ..., FE H | valor normal | ||
FF H | ± infinito | NaN (silencioso, señalización) |
El valor normal positivo mínimo es y el valor mínimo positivo (subnormal) es .
Conversión de representación decimal a formato binary32
En general, consulte el propio estándar IEEE 754 para la conversión estricta (incluido el comportamiento de redondeo) de un número real a su formato binary32 equivalente.
Aquí podemos mostrar cómo convertir un número real en base 10 a un formato IEEE 754 binary32 usando el siguiente esquema:
- Considere un número real con un entero y una fracción como 12,375
- Convertir y normalizar la parte entera en binario
- Convierta la parte fraccionaria usando la siguiente técnica como se muestra aquí
- Agregue los dos resultados y ajústelos para producir una conversión final adecuada
Conversión de la parte fraccionaria: Considere 0.375, la parte fraccionaria de 12.375. Para convertirlo en una fracción binaria, multiplique la fracción por 2, tome la parte entera y repita con la nueva fracción por 2 hasta que se encuentre una fracción de cero o hasta que se alcance el límite de precisión, que son 23 dígitos de fracciones para el formato IEEE 754 binary32 .
- , 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 eso se puede representar exactamente en binario como . No todas las fracciones decimales se pueden representar en una fracción binaria de dígitos finitos. Por ejemplo, el decimal 0.1 no se puede representar en binario exactamente, solo aproximado. Por lo tanto:
Dado que el formato binary32 IEEE 754 requiere que los valores reales se representen en formato (consulte Número normalizado , Número desnormalizado), 1100.011 se desplaza a la derecha en 3 dígitos para convertirse
Finalmente podemos ver que:
De lo que 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 en formato binary32 IEEE 754 de 32 bits resultante de 12.375:
Nota: considere convertir 68.123 al formato IEEE 754 binary32: utilizando el procedimiento anterior, espera obtener siendo los últimos 4 bits 1001. Sin embargo, debido al comportamiento de redondeo predeterminado del formato IEEE 754, lo que obtiene es , cuyos últimos 4 bits son 1010.
Ejemplo 1: Considere el decimal 1. Podemos ver que:
De lo que 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 en formato binary32 IEEE 754 de 32 bits resultante del número real 1:
Ejemplo 2: considere un valor de 0,25. Podemos ver eso:
De lo que deducimos:
- El exponente es −2 (y en la forma sesgada es )
- La fracción es 0 (mirando a la derecha del punto binario en 1.0 son todos ceros)
A partir de estos, podemos formar la representación en formato binary32 IEEE 754 de 32 bits resultante del número real 0.25:
Ejemplo 3: considere un valor de 0,375. Vimos eso
Por lo tanto, después de determinar una representación de 0.375 como podemos proceder como arriba:
- 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 una )
A partir de estos, podemos formar la representación en formato binary32 IEEE 754 de 32 bits resultante del número real 0.375:
Ejemplos de precisión simple
Estos ejemplos se dan en representación de bits , en hexadecimal y binario , del valor de coma flotante. Esto incluye el signo, exponente (sesgado) y significando.
0 00000000 00000000000000000000001 2 = 0000 0001 16 = 2 −126 × 2 −23 = 2 −149 ≈ 1,4012984643 × 10 −45 (número subnormal positivo más pequeño)
0 00000000 11111111111111111111111 2 = 007f ffff 16 = 2 −126 × (1 - 2 −23 ) ≈ 1,1754942107 × 10 −38 (número subnormal más grande)
0 00000001 00000000000000000000000 2 = 0.080 0000 16 = 2 -126 ≈ 1,1754943508 × 10 -38 (número normal positivo más pequeño)
0 11111110 11111111111111111111111 2 = 7f7f ffff 16 = 2 127 × (2 - 2 -23 ) ≈ 3,4028234664 × 10 38 (mayor número normal)
0 01111110 11111111111111111111111 2 = 3f7f ffff 16 = 1 - 2 -24 ≈ ,999999940395355225 (número más grande menos de uno)
0 01111111 00000000000000000000000 2 = 3f80 0000 16 = 1 (uno)
0 01111111 00000000000000000000001 2 = 3f80 0001 16 = 1 + 2 −23 ≈ 1.00000011920928955 (número más pequeño mayor que uno)
1 10000000 00000000000000000000000 2 = c000 0000 16 = −20 00000000 00000000000000000000000 2 = 0000 0000 16 = 01 00000000 00000000000000000000000 2 = 8000 0000 16 = −0 0 11111111 00000000000000000000000 2 = 7f80 0000 16 = infinito1 11111111 00000000000000000000000 2 = ff80 0000 16 = −infinito 0 10000000 10010010000111111011011 2 = 4049 0fdb 16 ≈ 3,14159274101257324 ≈ π (pi)0 01111101 01010101010101010101011 2 = 3eaa aaab 16 ≈ 0.333333343267440796 ≈ 1/3 x 11111111 10000000000000000000001 2 = ffc0 0001 16 = qNaN (en procesadores x86 y ARM)x 11111111 00000000000000000000001 2 = ff80 0001 16 = sNaN (en procesadores x86 y ARM)
Por defecto, 1/3 se redondea hacia arriba, en lugar de hacia abajo como precisión doble , debido al número par de bits en el significado. Los bits de 1/3 más allá del punto de redondeo son 1010...
más de 1/2 de una unidad en el último lugar .
Las codificaciones de qNaN y sNaN no se especifican en IEEE 754 y se implementan de manera diferente en diferentes procesadores. Los procesadores de la familia x86 y la familia ARM utilizan el bit más significativo del campo significativo para indicar un NaN silencioso. Los procesadores PA-RISC utilizan el bit para indicar una señalización NaN.
Conversión de binario de precisión simple a decimal
Comenzamos con la representación hexadecimal del valor, 41C80000 , en este ejemplo, y lo convertimos a binario:
luego lo dividimos en tres partes: bit de signo, exponente y significando.
- Bit de signo:
- Exponente:
- Significand:
Luego agregamos el bit 24 implícito al significado:
- Significand:
y decodificar el valor del exponente restando 127:
- Exponente bruto:
- Exponente decodificado:
Cada uno de los 24 bits del significando (incluido el bit 24 implícito), del bit 23 al bit 0, representa un valor que comienza en 1 y se divide en mitades para cada bit, de la siguiente manera:
bit 23 = 1bit 22 = 0.5bit 21 = 0,25bit 20 = 0,125bit 19 = 0.0625bit 18 = 0.03125..bit 0 = 0.00000011920928955078125
El significado en este ejemplo tiene tres bits establecidos: bit 23, bit 22 y bit 19. Ahora podemos decodificar el significado sumando los valores representados por estos bits.
- Significado decodificado:
Luego necesitamos multiplicar con la base, 2, a la potencia del exponente, para obtener el resultado final:
Por lo tanto
Esto es equivalente a:
donde s es el bit de signo, x es el exponente y m es el significando.
Limitaciones de precisión de los valores decimales en [1, 16777216]
- Decimales entre 1 y 2: intervalo fijo 2 −23 (1 + 2 −23 es el siguiente 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 = 4194304 y 2 23 = 8388608: intervalo fijo 2 −1 = 0.5
- Decimales entre 2 23 = 8388608 y 2 24 = 16777216: intervalo fijo 2 0 = 1
Limitaciones de precisión en valores enteros
- Los números enteros entre 0 y 16777216 se pueden representar exactamente (también se aplica a los números enteros negativos entre −16777216 y 0)
- Los enteros entre 2 24 = 16777216 y 2 25 = 33554432 se redondean a un múltiplo de 2 (número par)
- Los enteros entre 2 25 y 2 26 se redondean a un múltiplo de 4
- ...
- Los enteros entre 2 n y 2 n + 1 se redondean a un múltiplo de 2 n-23
- ...
- Números enteros entre 2 127 y 2 128 ronda a un múltiplo de 2 104
- Los números enteros mayores o iguales a 2 128 se redondean a "infinito".
Optimizaciones
El diseño del formato de punto flotante permite varias optimizaciones, como resultado de la fácil generación de una aproximación logarítmica en base 2 a partir de una vista entera del patrón de bits sin procesar. La aritmética de enteros y el desplazamiento de bits pueden producir una aproximación a la raíz cuadrada recíproca ( raíz cuadrada inversa rápida ), comúnmente requerida en gráficos por computadora .
Ver también
- Estándar IEEE para aritmética de coma flotante (IEEE 754)
- ISO / IEC 10967 , aritmética independiente del lenguaje
- Tipo de datos primitivo
- Estabilidad numérica
Referencias
- ^ "Declaración REAL" . scc.ustc.edu.cn .
- ^ "CLHS: Tipo CORTO FLOTADOR, SIMPLE FLOTADOR, DOBLE FLOTADOR ..."
- ^ "Tipos de datos primitivos" . Documentación de Java .
- ^ "6 tipos y clases predefinidos" . haskell.org . 20 de julio de 2010.
- ^ William Kahan (1 de octubre de 1997). "Notas de la conferencia sobre el estado del estándar IEEE 754 para aritmética de coma flotante binaria" (PDF) . pag. 4.
enlaces externos
- Editor de patrones de bits de punto flotante en vivo
- Calculadora online
- Convertidor en línea para números IEEE 754 con precisión simple
- Código fuente C para convertir entre precisión IEEE doble, simple y media