Articles

Formato de punto flotante de doble precisión

El punto flotante binario de doble precisión es un formato comúnmente utilizado en PC, debido a su rango más amplio sobre el punto flotante de una sola precisión, a pesar de su rendimiento y costo de ancho de banda. Es comúnmente conocido simplemente como doble. El estándar IEEE 754 especifica un binary64 que tiene:

  • Bit de signo: 1 bit
  • Exponente: 11 bits
  • Precisión significante: 53 bits (52 almacenados explícitamente)

El bit de signo determina el signo del número (incluso cuando este número es cero, que está firmado).

El campo exponente es un entero sin signo de 11 bits de 0 a 2047, en forma sesgada: un valor de exponente de 1023 representa el cero real. Los exponentes van de -1022 a +1023 porque los exponentes de -1023 (todos los 0) y +1024 (todos los 1) están reservados para números especiales.

La precisión significativa de 53 bits da de 15 a 17 dígitos decimales significativos de precisión (2-53 ≈ 1,11 × 10-16). Si una cadena decimal con un máximo de 15 dígitos significativos se convierte en una representación de doble precisión IEEE 754 y, a continuación, se convierte de nuevo en 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 doble precisión IEEE 754 se convierte en una cadena decimal con al menos 17 dígitos significativos, y luego se vuelve a convertir en una representación de doble precisión, el resultado final debe coincidir con el número original.

El formato se escribe con el significado que tiene un bit entero implícito de valor 1 (excepto para datos especiales, consulte la codificación de exponentes a continuación). Con los 52 bits de la fracción (F) significativa que aparece en el formato de memoria, la precisión total es, por lo tanto, de 53 bits (aproximadamente 16 dígitos decimales, 53 log10(2) ≈ 15.955). Los bits se presentan de la siguiente manera:

Formato de coma flotante doble IEEE 754.svg

El valor real asumido por un dato de doble precisión de 64 bits dado con un exponente sesgado dado e {\displaystyle e}

e

y una fracción de 52 bits es el signo (- 1) (1. b 51 b 50 . . . b 0) 2 × 2 e-1023 {\displaystyle (-1)^{\text{signo}} (1.b_{51} b_{50}…b_{0})_{2} \ times 2^{e-1023}}

(-1)^{\text{signo}} (1.b_{51} b_{50}...b_{0})_{2}\times 2^{e-1023}

o

( − 1 ) signo ( 1 + ∑ i = 1 52 b 52 − i 2 − i) x 2 e − 1023 {\displaystyle (-1)^{\text{signo}}\left(1+\sum _{i=1}^{52}b_{52-i}2^{-i}\derecho)\times 2^{e-1023}}

(-1)^{\text{signo}}\left(1+\sum _{i=1}^{52}b_{52-i}2^{-i}\derecho)\times 2^{e-1023}

Entre 252=4,503,599,627,370,496 y 253=9,007,199,254,740,992 lo representable números son exactamente los números enteros. Para el siguiente rango, de 253 a 254, todo se multiplica por 2, por lo que los números representables son los pares, etc. Por el contrario, para el rango anterior de 251 a 252, el espaciado es de 0,5, etc.

El espaciado como fracción de los números en el rango de 2n a 2n+1 es 2n-52.El error de redondeo relativo máximo al redondear un número al representable más cercano (la máquina epsilon) es, por lo tanto, 2-53.

El ancho de 11 bits del exponente permite la representación de números entre 10-308 y 10308, con una precisión de 15-17 dígitos decimales. Al comprometer la precisión, la representación subnormal permite valores aún más pequeños de hasta aproximadamente 5 × 10-324.

Codificación de exponenteseditar

El exponente de punto flotante binario de doble precisión se codifica utilizando una representación binaria de desplazamiento, con el desplazamiento de cero siendo 1023; también conocido como sesgo de exponente en el estándar IEEE 754. Ejemplos de estas representaciones podrían ser:

e =00000000001200116=1: 2 1 − 1023 = 2 − 1022 {\displaystyle 2^{1-1023}=2^{-1022}}

{\displaystyle 2^{1-1023}=2^{-1022}}
(smallest exponent for normal numbers)
e =0111111111123ff16=1023: 2 1023 − 1023 = 2 0 {\displaystyle 2^{1023-1023}=2^{0}}

{\displaystyle 2^{1023-1023}=2^{0}}
(zero offset)
e =10000000101240516=1029: 2 1029 − 1023 = 2 6 {\displaystyle 2^{1029-1023}=2^{6}}

{\displaystyle 2^{1029-1023}=2^{6}}
e =1111111111027fe16=2046: 2 2046 − 1023 = 2 1023 {\displaystyle 2^{2046-1023}=2^{1023}}

{\displaystyle 2^{2046-1023}=2^{1023}}
(highest exponent)

The exponents 00016 and 7ff16 have a special meaning:

  • 00000000000200016 is used to represent a signed zero (if F = 0) and subnormals (if F ≠ 0); y
  • 1111111111127ff16 se utiliza para representar ∞ (si F = 0) y Nan (si F ≠ 0),

donde F es la parte fraccionaria de la mantisa. Todos los patrones de bits son codificación válida.

A excepción de las excepciones anteriores, el número completo de doble precisión se describe con:

(- 1 ) signo × 2 e-1023 × 1. fracción {\displaystyle (-1)^{\text{signo}} \ times 2^{e-1023} \ times 1.{\text{fraction}}}

{\displaystyle (-1)^{\text{sign}}\times 2^{e-1023}\times 1.{\text {fraction}}}

En el caso de subnormales (e = 0) el número de doble precisión se describe con:

(- 1 ) signo × 2 1 − 1023 × 0. fracción = signo (- 1) × 2-1022 × 0. fracción {\displaystyle (-1)^{\text{signo}}\times 2^{1-1023}\times 0.{\text{fraction}}=(-1)^{\text{sign}}\times 2^{-1022}\times 0.{\text{fraction}}}

{\displaystyle (-1)^{\text{sign}}\times 2^{1-1023}\times 0.{\text{fraction}}=(-1)^{\text{sign}}\times 2^{-1022}\times 0.{\text{fraction}}}

EndiannessEdit

Esta sección es un extracto de Endianness § Coma flotante

Aunque los omnipresentes procesadores x86 de hoy en día usan almacenamiento little-endian para todos los tipos de datos (enteros, coma flotante), hay una serie de arquitecturas de hardware donde los números de coma flotante se representan en forma big-endian mientras que los enteros se representan en forma little-endiana. Hay procesadores ARM que tienen representación de punto flotante mitad little-endian, mitad big-endian para números de doble precisión: ambas palabras de 32 bits se almacenan en registros enteros tipo little-endian, pero la más significativa primero. Debido a que ha habido muchos formatos de coma flotante sin representación estándar de «red» para ellos, el estándar XDR utiliza big-endian IEEE 754 como su representación. Por lo tanto, puede parecer extraño que el extendido estándar de coma flotante IEEE 754 no especifique endianidad. Teóricamente, esto significa que incluso los datos de coma flotante IEEE estándar escritos por una máquina podrían no ser legibles por otra. Sin embargo, en las computadoras estándar modernas (p. ej., implementando IEEE 754), en la práctica se puede asumir con seguridad que la endianidad es la misma para los números de coma flotante que para los enteros, haciendo que la conversión sea sencilla independientemente del tipo de datos. (Sin embargo, los sistemas embebidos pequeños que utilizan formatos especiales de coma flotante pueden ser otra cuestión.)

Doble precisión examplesEdit

0 01111111111 00000000000000000000000000000000000000000000000000002 ≙ 3FF0 0000 0000 000016 ≙ +20 × 1 = 1

0 01111111111 00000000000000000000000000000000000000000000000000012 ≙ 3FF0 0000 0000 000116 ≙ +20 × (1 + 2-52) ≈ 1.0000000000000002, the smallest number > 1

0 01111111111 00000000000000000000000000000000000000000000000000102 ≙ 3FF0 0000 0000 000216 ≙ +20 × (1 + 2−51) ≈ 1.0000000000000004

0 10000000000 00000000000000000000000000000000000000000000000000002 ≙ 4000 0000 0000 000016 ≙ +21 × 1 = 2

1 10000000000 00000000000000000000000000000000000000000000000000002 ≙ C000 0000 0000 000016 ≙ −21 × 1 = −2

0 10000000000 10000000000000000000000000000000000000000000000000002 ≙ 4008 0000 0000 000016 ≙ +21 × 1.12 = 112 = 3

0 10000000001 00000000000000000000000000000000000000000000000000002 ≙ 4010 0000 0000 000016 ≙ +22 × 1 = 1002 = 4

0 10000000001 01000000000000000000000000000000000000000000000000002 ≙ 4014 0000 0000 000016 ≙ +22 × 1.012 = 1012 = 5

0 10000000001 10000000000000000000000000000000000000000000000000002 ≙ 4018 0000 0000 000016 ≙ +22 × 1.12 = 1102 = 6

0 10000000011 01110000000000000000000000000000000000000000000000002 ≙ 4037 0000 0000 000016 ≙ +24 × 1.01112 = 101112 = 23

0 01111111000 10000000000000000000000000000000000000000000000000002 ≙ 3F88 0000 0000 000016 ≙ +2−7 × 1.12 = 0.000000112 = 0.01171875 (3/256)

0 00000000000 00000000000000000000000000000000000000000000000000012 ≙ 0000 0000 0000 000116 ≙ +2−1022 × 2−52 = 2−1074
≈ 4.9406564584124654 × 10−324 (Min. subnormal positive double)

0 00000000000 11111111111111111111111111111111111111111111111111112 ≙ 000F FFFF FFFF FFFF16 ≙ +2−1022 × (1 − 2−52)
≈ 2.2250738585072009 × 10−308 (Max. subnormal double)

0 00000000001 00000000000000000000000000000000000000000000000000002 ≙ 0010 0000 0000 000016 ≙ +2−1022 × 1
≈ 2.2250738585072014 × 10−308 (Min. normal positive double)

0 11111111110 11111111111111111111111111111111111111111111111111112 ≙ 7FEF FFFF FFFF FFFF16 ≙ +21023 × (1 + (1 − 2−52))
≈ 1.7976931348623157 × 10308 (Max. Double)

0 00000000000 00000000000000000000000000000000000000000000000000002 ≙ 0000 0000 0000 000016 ≙ +0

1 00000000000 00000000000000000000000000000000000000000000000000002 ≙ 8000 0000 0000 000016 ≙ −0

0 11111111111 00000000000000000000000000000000000000000000000000002 ≙ 7FF0 0000 0000 000016 ≙ +∞ (positive infinity)

1 11111111111 00000000000000000000000000000000000000000000000000002 ≙ FFF0 0000 0000 000016 ≙ −∞ (negative infinity)

0 11111111111 00000000000000000000000000000000000000000000000000012 ≙ 7FF0 0000 0000 000116 ≙ NaN (sNaN on most processors, such as x86 and ARM)

0 11111111111 10000000000000000000000000000000000000000000000000012 ≙ 7FF8 0000 0000 000116 ≙ NaN (qNaN on most processors, such as x86 and ARM)

0 11111111111 11111111111111111111111111111111111111111111111111112 ≙ 7FFF FFFF FFFF FFFF16 N NaN (una codificación alternativa de NaN)

0 01111111101 01010101010101010101010101010101010101010101010101012 = 3FD5 5555 5555 555516 ≙ +2-2 × (1 + 2-2 + 2-4 + … + 2-52) ≈ 1/3

0 10000000000 10010010000111111011010101000100010000101101000110002 = 4009 21FB 5444 2D1816 ≈ pi

Codificaciones de qNaN y nan no están completamente especificados en IEEE 754 y dependen del procesador. La mayoría de los procesadores, como la familia x86 y los procesadores de la familia ARM, utilizan el bit más significativo del campo significand para indicar un NaN silencioso; esto es lo que recomienda IEEE 754. Los procesadores PA-RISC usan el bit para indicar una NaN de señalización.

De forma predeterminada, 1/3 redondea hacia abajo, en lugar de hacia arriba como precisión única, debido al número impar de bits en el significando.

En más detalle:

Given the hexadecimal representation 3FD5 5555 5555 555516, Sign = 0 Exponent = 3FD16 = 1021 Exponent Bias = 1023 (constant value; see above) Fraction = 5 5555 5555 555516 Value = 2(Exponent − Exponent Bias) × 1.Fraction – Note that Fraction must not be converted to decimal here = 2−2 × (15 5555 5555 555516 × 2−52) = 2−54 × 15 5555 5555 555516 = 0.333333333333333314829616256247390992939472198486328125 ≈ 1/3

La velocidad de ejecución con aritmética de doble precisióneditar

Utilizando variables de coma flotante de doble precisión y funciones matemáticas (por ejemplo, sin, cos, atan2, log, exp y sqrt) es más lenta que trabajar con sus contrapartes de precisión única. Un área de la computación donde este es un problema particular es el código paralelo que se ejecuta en GPU. Por ejemplo, cuando se utiliza la plataforma CUDA de NVIDIA, los cálculos con doble precisión tardan, dependiendo de un hardware, aproximadamente de 2 a 32 veces más en completarse en comparación con los que se realizan con una sola precisión.

Limitaciones de precisión en valores integeroseditar

  • Los enteros de -253 a 253 (-9007199254740992 a 9007199254740992) se pueden representar exactamente
  • Enteros entre 253 y 254 = 18014398509481984 redondeados a múltiplo de 2 (número par)
  • Enteros entre 254 y 255 = 36028797018963968 redondear a un múltiplo de 4

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *