stringtranslate.com

coma flotante decimal

La aritmética de punto flotante decimal ( DFP ) se refiere tanto a una representación como a operaciones con números de punto flotante decimal . Trabajar directamente con fracciones decimales (base 10) puede evitar los errores de redondeo que normalmente ocurren al convertir entre fracciones decimales (comunes en datos ingresados ​​por humanos, como mediciones o información financiera) y fracciones binarias (base 2).

La ventaja de la representación decimal de punto flotante sobre la representación decimal de punto fijo y de entero es que admite una gama mucho más amplia de valores. Por ejemplo, mientras que una representación de punto fijo que asigna 8 dígitos decimales y 2 decimales puede representar los números 123456,78, 8765,43, 123,00, etc., una representación de punto flotante con 8 dígitos decimales también podría representar 1,2345678, 1234567,8, 0,000012345678, 12345678000000000, y así sucesivamente. Este rango más amplio puede ralentizar drásticamente la acumulación de errores de redondeo durante cálculos sucesivos; por ejemplo, el algoritmo de suma de Kahan se puede utilizar en punto flotante para sumar muchos números sin acumulación asintótica de error de redondeo.

Implementaciones

Los primeros usos mecánicos del punto flotante decimal son evidentes en el ábaco , la regla de cálculo , la calculadora Smallwood y algunas otras calculadoras que admiten entradas en notación científica . En el caso de las calculadoras mecánicas, el exponente suele tratarse como información complementaria que se contabiliza por separado.

La computadora IBM 650 admitía un formato de punto flotante decimal de 8 dígitos en 1953. [1] La máquina Wang VS, que de otro modo sería binaria , admitía un formato de punto flotante decimal de 64 bits en 1977. [2] La biblioteca de soporte de punto flotante para El procesador Motorola 68040 proporcionó un formato de almacenamiento de punto flotante decimal de 96 bits en 1990. [2]

Algunos lenguajes informáticos tienen implementaciones de aritmética decimal de punto flotante, incluidos PL/I , C# , Java con BigDecimal, emacs con calc y el módulo decimal de Python . En 1987, el IEEE lanzó IEEE 854 , un estándar para computación con punto flotante decimal, que carecía de una especificación sobre cómo se debían codificar los datos de punto flotante para su intercambio con otros sistemas. Esto se abordó posteriormente en IEEE 754-2008 , que estandarizó la codificación de datos de punto flotante decimal, aunque con dos métodos alternativos diferentes.

IBM POWER6 y los procesadores POWER más nuevos incluyen DFP en el hardware, al igual que IBM System z9 [3] (y máquinas zSeries posteriores). SilMinds ofrece SilAx, un coprocesador DFP vectorial configurable . [4] IEEE 754-2008 define esto con más detalle. Fujitsu también cuenta con procesadores Sparc de 64 bits con DFP en hardware. [5] [2]

Microsoft C#, o .NET , utiliza System.Decimal. [6]

Codificación IEEE 754-2008

El estándar IEEE 754-2008 define representaciones de punto flotante decimal de 32, 64 y 128 bits. Al igual que los formatos binarios de punto flotante, el número se divide en un signo, un exponente y un significado . A diferencia del punto flotante binario, los números no están necesariamente normalizados; los valores con pocos dígitos significativos tienen múltiples representaciones posibles: 1×10 2 =0.1×10 3 =0.01×10 4 , etc. Cuando el significado es cero, el exponente puede ser cualquier valor.

Los rangos de exponentes se eligieron de modo que el rango disponible para los valores normalizados sea aproximadamente simétrico. Como esto no se puede hacer exactamente con un número par de valores de exponente posibles, el valor adicional se le dio a Emax.

Se definen dos representaciones diferentes:

Ambas alternativas proporcionan exactamente el mismo rango de valores representables.

Los dos bits más significativos del exponente están limitados al rango de 0-2, y los 4 bits más significativos del significado están limitados al rango de 0-9. Las 30 combinaciones posibles están codificadas en un campo de 5 bits, junto con formas especiales para infinito y NaN .

Si los 4 bits más significativos del significado están entre 0 y 7, el valor codificado comienza de la siguiente manera:

s 00mmm xxx El exponente comienza con 00, significa 0mmms 01mmm xxx El exponente comienza con 01, significa 0mmms 10mmm xxx El exponente comienza con 10, significa 0mmm

Si los 4 bits iniciales del significado son binarios 1000 o 1001 (8 o 9 decimales), el número comienza de la siguiente manera:

s 1100m xxx El exponente comienza con 00, significa 100ms 1101m xxx El exponente comienza con 01, significa 100ms 1110m xxx El exponente comienza con 10, significativo con 100m

El bit inicial (s en lo anterior) es un bit de signo, y los bits siguientes (xxx en lo anterior) codifican los bits exponentes adicionales y el resto del dígito más significativo, pero los detalles varían según la alternativa de codificación utilizada.

Las combinaciones finales se utilizan para infinitos y NaN, y son las mismas para ambas codificaciones alternativas:

s 11110 x ±Infinito (ver recta de números reales extendida )s 11111 0 NaN silencioso (bit de signo ignorado)s 11111 1 señalización NaN (bit de signo ignorado)

En los últimos casos, se ignoran todos los demás bits de la codificación. Por lo tanto, es posible inicializar una matriz en NaN llenándola con un valor de un solo byte.

Campo de significado de entero binario

Este formato utiliza un significado binario de 0 a 10 p −1. Por ejemplo, el significado de Decimal32 puede ser hasta 10 7 −1 = 9 999 999 = 98967F 16 = 1001 1000100101 1001111111 2 . Si bien la codificación puede representar significados más amplios, son ilegales y el estándar requiere que las implementaciones los traten como 0, si se encuentran en la entrada.

Como se describió anteriormente, la codificación varía dependiendo de si los 4 bits más significativos del significado están en el rango de 0 a 7 (0000 2 a 0111 2 ) o superior (1000 2 o 1001 2 ).

Si los 2 bits después del bit de signo son "00", "01" o "10", entonces el campo de exponente consta de los 8 bits que siguen al bit de signo (los 2 bits mencionados más los 6 bits del "campo de continuación del exponente") , y el significado son los 23 bits restantes, con un bit 0 inicial implícito, que se muestra aquí entre paréntesis:

s 00eeeeee (0)ttt tttttttttt tttttttttt s 01eeeeee (0)ttt tttttttttt tttttttttt s 10eeeeee (0)ttt tttttttttt tttttttttt

Esto incluye números subnormales donde el dígito significativo principal es 0.

Si los 2 bits después del bit de signo son "11", entonces el campo exponente de 8 bits se desplaza 2 bits hacia la derecha (después del bit de signo y de los bits "11" posteriores), y el significado representado está en el resto. 21 bits. En este caso hay una secuencia inicial implícita (es decir, no almacenada) de 3 bits "100" en el verdadero significado:

s 1100eeeeee (100)t tttttttttt tttttttttt s 1101eeeeee (100)t tttttttttt tttttttttt s 1110eeeeee (100)t tttttttttt tttttttttt

La secuencia de 2 bits "11" después del bit de signo indica que hay un prefijo implícito de 3 bits "100" para el significado.

Tenga en cuenta que los bits iniciales del campo de significado no codifican el dígito decimal más significativo; son simplemente parte de un número binario puro más grande. Por ejemplo, un significado de 8 000 000 se codifica como binario 0111 1010000100 1000000000 , con los 4 bits iniciales codificando 7; el primer significado que requiere un bit 24 (y por lo tanto la segunda forma de codificación) es 2 23 = 8 388 608 .

En los casos anteriores, el valor representado es:

(−1) signo × 10 exponente −101 × significado

Decimal64 y Decimal128 funcionan de manera análoga, pero con una continuación de exponente mayor y campos significativos. Para Decimal128, la segunda forma de codificación nunca se utiliza; el significado válido más grande de 10 34 −1 = 1ED09BEAD87C0378D8E63FFFFFFFF 16 se puede representar en 113 bits.

Campo de significado decimal densamente empaquetado

En esta versión, el significado se almacena como una serie de dígitos decimales. El dígito inicial está entre 0 y 9 (3 o 4 bits binarios) y el resto del significado utiliza la codificación decimal densamente empaquetada (DPD).

Los dos primeros bits del exponente y el primer dígito (3 o 4 bits) del significado se combinan en los cinco bits que siguen al bit de signo. A esto le sigue un campo de continuación de exponente de desplazamiento fijo.

Finalmente, el campo de continuación significativo está formado por 2, 5 u 11 declets de 10 bits , cada uno de los cuales codifica 3 dígitos decimales. [7]

Si los primeros dos bits después del bit de signo son "00", "01" o "10", entonces esos son los bits iniciales del exponente, y los tres bits posteriores se interpretan como el dígito decimal inicial (0 a 7). ): [8]

 Peine. Exponente significativo s 00 TTT (00)eeeeee (0TTT)[tttttttttt][tttttttttt] s 01 TTT (01)eeeeee (0TTT)[tttttttttt][tttttttttt] s 10 TTT (10)eeeeee (0TTT)[tttttttttt][tttttttttt]

Si los dos primeros bits después del bit de signo son "11", entonces los dos segundos bits son los bits iniciales del exponente y el último bit tiene el prefijo "100" para formar el dígito decimal inicial (8 o 9):

 Peine. Exponente significativo s 1100 T (00)eeeeee (100T)[tttttttttt][tttttttttt] s 1101 T (01)eeeeee (100T)[tttttttttt][tttttttttt] s 1110 T (10)eeeeee (100T)[tttttttttt][tttttttttt]

Las dos combinaciones restantes (11110 y 11111) del campo de 5 bits se utilizan para representar ± infinito y NaN, respectivamente.

Operaciones aritméticas de punto flotante

La regla habitual para realizar aritmética de punto flotante es que se calcula el valor matemático exacto [9] y luego el resultado se redondea al valor representable más cercano con la precisión especificada. De hecho, este es el comportamiento exigido para el hardware informático compatible con IEEE, bajo un comportamiento de redondeo normal y en ausencia de condiciones excepcionales.

Para facilitar la presentación y la comprensión, en los ejemplos se utilizará precisión de 7 dígitos. Los principios fundamentales son los mismos en cualquier precisión.

Suma

Un método sencillo para sumar números de punto flotante es representarlos primero con el mismo exponente. En el siguiente ejemplo, el segundo número se desplaza 3 dígitos hacia la derecha. Procedemos con el método de suma habitual:

El siguiente ejemplo es decimal, lo que simplemente significa que la base es 10.

 123456,7 = 1,234567 × 10 5 101,7654 = 1,017654 × 10 2 = 0,001017654 × 10 5

Por eso:

 123456,7 + 101,7654 = (1,234567 × 10 5 ) + (1,017654 × 10 2 ) = (1,234567 × 10 5 ) + (0,001017654 × 10 5 ) = 10 5 × (1,234567 + 0,001017654) = 10 5 × 1,235584654

Esto no es otra cosa que convertir a notación científica . En detalle:

 e=5; s=1,234567 (123456,7)+ mi=2; s=1,017654 (101,7654)
 e=5; s=1,234567+e=5; s=0,001017654 (después del cambio)-------------------- e=5; s=1,235584654 (suma verdadera: 123558,4654)

Este es el verdadero resultado, la suma exacta de los operandos. Se redondeará a 7 dígitos y luego se normalizará si es necesario. El resultado final es:

 e=5; s=1,235585 (suma final: 123558,5)

Tenga en cuenta que los 3 dígitos inferiores del segundo operando (654) prácticamente se pierden. Este es un error de redondeo . En casos extremos, la suma de dos números distintos de cero puede ser igual a uno de ellos:

 e=5; s=1,234567+ mi=−3; s=9,876543
 e=5; s=1,234567+e=5; s=0.00000009876543 (después del cambio)---------------------- e=5; s=1.23456709876543 (suma verdadera) e=5; s=1,234567 (después de redondear/normalizar)

Otro problema de pérdida de significancia ocurre cuando se restan aproximaciones a dos números casi iguales. En el siguiente ejemplo e  = 5; s  = 1,234571 y e  = 5; s  = 1,234567 son aproximaciones a los racionales 123457,1467 y 123456,659.

 e=5; s=1,234571− e=5; s=1,234567---------------- e=5; s=0,000004 mi=-1; s=4.000000 (después de redondear y normalizar)

La diferencia de punto flotante se calcula exactamente porque los números son cercanos; el lema de Sterbenz garantiza esto, incluso en caso de desbordamiento cuando se admite un desbordamiento gradual . A pesar de esto, la diferencia de los números originales es e  = −1; s  = 4,877000, que difiere más del 20% de la diferencia e  = −1; s  = 4.000000 de las aproximaciones. En casos extremos, se pueden perder todos los dígitos significativos de precisión. [10] [11] Esta cancelación ilustra el peligro de asumir que todos los dígitos de un resultado calculado son significativos. Tratar las consecuencias de estos errores es un tema del análisis numérico ; consulte también Problemas de precisión.

Multiplicación

Para multiplicar, se multiplican los significados, mientras que se suman los exponentes y el resultado se redondea y normaliza.

 e=3; s=4,734612×e=5; s=5,417242----------------------- e=8; s=25.648538980104 (producto real) e=8; s=25,64854 (después de redondear) e=9; s=2,564854 (después de la normalización)

La división se hace de manera similar, pero es más complicada.

No hay problemas de cancelación o absorción con la multiplicación o división, aunque se pueden acumular pequeños errores a medida que las operaciones se realizan repetidamente. En la práctica, la forma en que se llevan a cabo estas operaciones en la lógica digital puede resultar bastante compleja.

Ver también

Referencias

  1. ^ Beebe, Nelson HF (22 de agosto de 2017). "Capítulo H. Arquitecturas históricas de punto flotante". Manual de computación de funciones matemáticas: programación utilizando la biblioteca de software portátil MathCW (1 ed.). Salt Lake City, UT, EE.UU.: Springer International Publishing AG . pag. 948. doi :10.1007/978-3-319-64110-2. ISBN 978-3-319-64109-6. LCCN  2017947446. S2CID  30244721.
  2. ^ abc Savard, John JG (2018) [2007]. "El estándar de coma flotante decimal". cuadribloc . Archivado desde el original el 3 de julio de 2018 . Consultado el 16 de julio de 2018 .
  3. ^ "IBM z9 EC y z9 BC: ofrecer mayor valor para todos" (PDF) . 306.ibm.com . Consultado el 7 de julio de 2018 .
  4. ^ "IP aritméticas para aplicaciones financieras - SilMinds". Silminds.com .
  5. ^ "Capítulo 4. Formatos de datos". Especificación Sparc64 X/X+ . Nakahara-ku, Kawasaki, Japón. Enero de 2015. p. 13.{{cite book}}: CS1 maint: location missing publisher (link)
  6. ^ "Coma flotante decimal en .NET". Yoda.arachsys.com .
  7. ^ Müller, Jean-Michel; Brisebarre, Nicolás; de Dinechin, Florent; Jeannerod, Claude-Pierre; Lefèvre, Vicente; Melquiond, Guillaume; Revol, Nathalie ; Stehlé, Damián; Torres, Serge (2010). Manual de aritmética de coma flotante (1 ed.). Birkhäuser . doi :10.1007/978-0-8176-4705-6. ISBN 978-0-8176-4704-9. LCCN  2009939668.
  8. ^ Especificación de codificación decimal, versión 1.00, de IBM
  9. ^ El hardware de la computadora no calcula necesariamente el valor exacto; simplemente tiene que producir el resultado redondeado equivalente como si hubiera calculado el resultado infinitamente preciso.
  10. ^ Goldberg, David (marzo de 1991). "Lo que todo informático debería saber sobre la aritmética de punto flotante" (PDF) . Encuestas de Computación ACM . 23 (1): 5–48. doi :10.1145/103162.103163. S2CID  222008826 . Consultado el 20 de enero de 2016 .([1], [2], [3])
  11. ^ Patente estadounidense 3037701A, Huberto M Sierra, "Medios de control aritmético de punto decimal flotante para calculadora", publicada el 5 de junio de 1962 

Otras lecturas