¿Cuál es la diferencia entre una operación de punto flotante de precisión simple y doble precisión?


169

¿Cuál es la diferencia entre una operación de punto flotante de precisión simple y una operación flotante de precisión doble?

Estoy especialmente interesado en términos prácticos en relación con las consolas de videojuegos. Por ejemplo, ¿la Nintendo 64 tiene un procesador de 64 bits y, si lo tiene, eso significaría que es capaz de operaciones de punto flotante de doble precisión? ¿Pueden la PS3 y Xbox 360 realizar operaciones de coma flotante de doble precisión o solo una precisión única y, en general, se utilizan las capacidades de doble precisión (si existen)?


17
El hecho de que la CPU sea de 64 bits generalmente significa que la CPU tiene registros de propósito general de 64 bits (es decir, enteros) y el tamaño de la dirección de memoria . Pero no dice nada sobre las matemáticas de coma flotante. Por ejemplo, las CPU Intel IA-32 son de 32 bits, pero admiten de forma nativa flotadores de doble precisión.
Roman Zavalov el

Respuestas:


215

Nota: la Nintendo 64 tiene un procesador de 64 bits, sin embargo:

Muchos juegos aprovecharon el modo de procesamiento de 32 bits del chip, ya que los juegos 3D generalmente no requieren una mayor precisión de datos disponible con los tipos de datos de 64 bits, así como el hecho de que el procesamiento de datos de 64 bits usa el doble de RAM, caché y ancho de banda, lo que reduce el rendimiento general del sistema.

De Webopedia :

El término doble precisión es algo inapropiado porque la precisión no es realmente doble.
La palabra doble deriva del hecho de que un número de doble precisión usa el doble de bits que un número de coma flotante regular.
Por ejemplo, si un número de precisión simple requiere 32 bits, su contraparte de doble precisión tendrá una longitud de 64 bits.

Los bits adicionales aumentan no solo la precisión sino también el rango de magnitudes que se pueden representar.
La cantidad exacta por la cual se incrementa la precisión y el rango de magnitudes depende del formato que el programa esté utilizando para representar valores de punto flotante.
La mayoría de las computadoras usan un formato estándar conocido como formato de punto flotante IEEE.

El formato de doble precisión IEEE en realidad tiene más del doble de bits de precisión que el formato de precisión simple, así como un rango mucho mayor.

Del estándar IEEE para aritmética de coma flotante

Precisión simple

La representación estándar de coma flotante de precisión simple IEEE requiere una palabra de 32 bits, que puede representarse como numerada del 0 al 31, de izquierda a derecha.

  • El primer bit es el bit de signo , S,
  • los siguientes ocho bits son los bits exponentes , 'E' y
  • los 23 bits finales son la fracción 'F':

    S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
    0 1      8 9                    31
    

El valor V representado por la palabra se puede determinar de la siguiente manera:

  • Si E = 255 y F no es cero, entonces V = NaN ("No es un número")
  • Si E = 255 y F es cero y S es 1, entonces V = -Infinito
  • Si E = 255 y F es cero y S es 0, entonces V = Infinito
  • Si 0<E<255entonces, V=(-1)**S * 2 ** (E-127) * (1.F)donde "1.F" está destinado a representar el número binario creado al prefijar F con un 1 inicial implícito y un punto binario.
  • Si E = 0 y F no es cero, entonces V=(-1)**S * 2 ** (-126) * (0.F). Estos son valores "no normalizados".
  • Si E = 0 y F es cero y S es 1, entonces V = -0
  • Si E = 0 y F es cero y S es 0, entonces V = 0

En particular,

0 00000000 00000000000000000000000 = 0
1 00000000 00000000000000000000000 = -0

0 11111111 00000000000000000000000 = Infinity
1 11111111 00000000000000000000000 = -Infinity

0 11111111 00000100000000000000000 = NaN
1 11111111 00100010001001010101010 = NaN

0 10000000 00000000000000000000000 = +1 * 2**(128-127) * 1.0 = 2
0 10000001 10100000000000000000000 = +1 * 2**(129-127) * 1.101 = 6.5
1 10000001 10100000000000000000000 = -1 * 2**(129-127) * 1.101 = -6.5

0 00000001 00000000000000000000000 = +1 * 2**(1-127) * 1.0 = 2**(-126)
0 00000000 10000000000000000000000 = +1 * 2**(-126) * 0.1 = 2**(-127) 
0 00000000 00000000000000000000001 = +1 * 2**(-126) * 
                                     0.00000000000000000000001 = 
                                     2**(-149)  (Smallest positive value)

Precisión doble

La representación estándar de coma flotante de precisión doble IEEE requiere una palabra de 64 bits, que puede representarse como numerada del 0 al 63, de izquierda a derecha.

  • El primer bit es el bit de signo , S,
  • los siguientes once bits son los bits exponentes , 'E' y
  • los 52 bits finales son la fracción 'F':

    S EEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    0 1        11 12                                                63
    

El valor V representado por la palabra se puede determinar de la siguiente manera:

  • Si E = 2047 y F no es cero, entonces V = NaN ("No es un número")
  • Si E = 2047 y F es cero y S es 1, entonces V = -Infinito
  • Si E = 2047 y F es cero y S es 0, entonces V = Infinito
  • Si 0<E<2047entonces, V=(-1)**S * 2 ** (E-1023) * (1.F)donde "1.F" está destinado a representar el número binario creado al prefijar F con un 1 inicial implícito y un punto binario.
  • Si E = 0 y F no es cero, V=(-1)**S * 2 ** (-1022) * (0.F)estos son valores "no normalizados".
  • Si E = 0 y F es cero y S es 1, entonces V = -0
  • Si E = 0 y F es cero y S es 0, entonces V = 0

Referencia:
ANSI / IEEE Standard 754-1985,
Standard for Binary Floating Point Aritmetic.


9
Sé que esto proviene de su fuente, pero no me gusta la frase: "El término precisión doble es algo inapropiado porque la precisión no es realmente doble". La precisión simple y doble en estos días está definida universalmente por IEEE, y como usted señala, la precisión simple tiene 23 bits en la fracción y el doble tiene 52 bits, eso es básicamente el doble de precisión ...
Carl Walsh

55
@ZeroDivide ' **' es exponenciación
VonC

11
@CarlWalsh 52/23! = 2 ergo no es "el doble de precisión"
rfoo

@johnson Tiene más detalles acerca de los valores no normalizados en easy68k.com/paulrsm/6502/WOZFPPAK.TXT , y también en stackoverflow.com/a/28801033/6309
VonC

2
@rfoo Si quieres ser pedante seguro, no es exactamente el doble, pero 52/2> 23, así que sí, es el doble de precisión, es solo el doble y algo más.
JShorthouse

42

Leí muchas respuestas, pero ninguna parece explicar correctamente de dónde viene la palabra doble . Recuerdo una muy buena explicación dada por un profesor universitario que tuve hace algunos años.

Recordando el estilo de la respuesta de VonC, una única representación de coma flotante de precisión utiliza una palabra de 32 bits.

  • 1 bit para el signo , S
  • 8 bits para el exponente , 'E'
  • 24 bits para la fracción , también llamada mantisa , o coeficiente (aunque solo se representan 23). Llamémoslo 'M' (para mantissa , prefiero este nombre ya que "fracción" puede malinterpretarse).

Representación:

          S  EEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMM
bits:    31 30      23 22                     0

(Solo para señalar, el bit de signo es el último, no el primero).

Una representación de coma flotante de doble precisión utiliza una palabra de 64 bits.

  • 1 bit para el signo , S
  • 11 bits para el exponente , 'E'
  • 53 bits para la fracción / mantisa / coeficiente (aunque solo 52 están representados), 'M'

Representación:

           S  EEEEEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
bits:     63 62         52 51                                                  0

Como puede observar, escribí que la mantisa tiene, en ambos tipos, un poco más de información en comparación con su representación. De hecho, la mantisa es un número representado sin todo su no significativo 0. Por ejemplo,

  • 0.000124 se convierte en 0.124 × 10 −3
  • 237.141 se convierte en 0.237141 × 10 3

Esto significa que la mantisa siempre tendrá la forma

0.α 1 α 2 ... α t × β p

donde β es la base de la representación. Pero como la fracción es un número binario, α 1 siempre será igual a 1, por lo que la fracción se puede reescribir como 1.α 2 α 3 ... α t + 1 × 2 p y se puede suponer implícitamente el 1 inicial, haciendo espacio para un bit extra (α t + 1 ).

Ahora, obviamente es cierto que el doble de 32 es 64, pero no es de ahí de donde viene la palabra.

La precisión indica el número de dígitos decimales que son correctos , es decir, sin ningún tipo de error de representación o aproximación. En otras palabras, indica cuántos dígitos decimales se pueden usar con seguridad .

Dicho esto, es fácil estimar la cantidad de dígitos decimales que se pueden usar de forma segura:

  • precisión simple : log 10 (2 24 ), que tiene aproximadamente 7 ~ 8 dígitos decimales
  • doble precisión : log 10 (2 53 ), que es de aproximadamente 15 ~ 16 dígitos decimales

19

De acuerdo, la diferencia básica en la máquina es que la precisión doble usa el doble de bits que una sola. En la implementación habitual, son 32 bits para un solo, 64 bits para el doble.

Pero lo que hace que la media ? Si asumimos el estándar IEEE, entonces un solo número de precisión tiene aproximadamente 23 bits de la mantisa y un exponente máximo de aproximadamente 38; una precisión doble tiene 52 bits para la mantisa y un exponente máximo de aproximadamente 308.

Los detalles están en Wikipedia , como siempre.


11

Para agregar a todas las maravillosas respuestas aquí

En primer lugar, flotante y doble se usan para representar números fraccionarios. Entonces, la diferencia entre los dos radica en el hecho de cuánta precisión pueden almacenar los números.

Por ejemplo: tengo que almacenar 123.456789 Uno puede almacenar solo 123.4567 mientras que otro puede almacenar el 123.456789 exacto.

Entonces, básicamente queremos saber con qué precisión se puede almacenar el número y es lo que llamamos precisión.

Citando a @Alessandro aquí

La precisión indica el número de dígitos decimales que son correctos , es decir, sin ningún tipo de error de representación o aproximación. En otras palabras, indica cuántos dígitos decimales se pueden usar con seguridad .

El flotador puede almacenar con precisión entre 7 y 8 dígitos en la parte fraccionaria, mientras que Double puede almacenar con precisión entre 15 y 16 dígitos en la parte fraccional

Entonces, el flotador puede almacenar el doble de la cantidad de parte fraccional. Es por eso que Double se llama double the float


7

En cuanto a la pregunta "¿Pueden ps3 y xbxo 360 realizar operaciones de coma flotante de doble precisión o solo precisión simple y, en el uso de generel, se utilizan las capacidades de doble precisión (si es que existen)?"

Creo que ambas plataformas son incapaces de doble punto flotante. El procesador Cell original solo tenía flotantes de 32 bits, lo mismo con el hardware ATI en el que se basa la XBox 360 (R600). The Cell recibió soporte de doble punto flotante más adelante, pero estoy bastante seguro de que la PS3 no usa ese chip.


5

Básicamente, la aritmética de coma flotante de precisión simple trata con números de coma flotante de 32 bits, mientras que la precisión doble trata con 64 bits.

El número de bits en doble precisión aumenta el valor máximo que se puede almacenar, así como también aumenta la precisión (es decir, el número de dígitos significativos).


5

Todos han explicado con gran detalle y nada que pueda agregar más. Aunque me gustaría explicarlo en los Términos de Layman o en INGLÉS

1.9 is less precise than 1.99
1.99 is less precise than 1.999
1.999 is less precise than 1.9999

.....

Una variable, capaz de almacenar o representar "1.9" proporciona menos precisión que la que puede contener o representar 1.9999. Estas fracciones pueden suponer una gran diferencia en grandes cálculos.


2

La precisión doble significa que los números tardan el doble de la longitud de la palabra en almacenarse. En un procesador de 32 bits, las palabras son todas de 32 bits, por lo que las dobles son de 64 bits. Lo que esto significa en términos de rendimiento es que las operaciones con números de doble precisión tardan un poco más en ejecutarse. Entonces obtienes un mejor rango, pero hay un pequeño impacto en el rendimiento. Este golpe es mitigado un poco por las unidades de coma flotante de hardware, pero sigue ahí.

El N64 utilizaba un NEC VR4300 basado en MIPS R4300i, que es un procesador de 64 bits, pero el procesador se comunica con el resto del sistema a través de un bus de 32 bits de ancho. Entonces, la mayoría de los desarrolladores usaron números de 32 bits porque son más rápidos, y la mayoría de los juegos en ese momento no necesitaban la precisión adicional (por lo que usaron flotantes no dobles).

Los tres sistemas pueden realizar operaciones flotantes de precisión simple y doble, pero podrían no hacerlo debido al rendimiento. (aunque casi todo después de que el n64 usó un bus de 32 bits, así que ...)


1

En primer lugar, flotante y doble se usan para representar números fraccionarios. Entonces, la diferencia entre los dos radica en el hecho de cuánta precisión pueden almacenar los números.

Por ejemplo: tengo que almacenar 123.456789 Uno puede almacenar solo 123.4567 mientras que otro puede almacenar el 123.456789 exacto.

Entonces, básicamente queremos saber con qué precisión se puede almacenar el número y es lo que llamamos precisión.

Citando a @Alessandro aquí

La precisión indica el número de dígitos decimales que son correctos, es decir, sin ningún tipo de error de representación o aproximación. En otras palabras, indica cuántos dígitos decimales se pueden usar con seguridad.

El flotador puede almacenar con precisión entre 7 y 8 dígitos en la parte fraccionaria, mientras que Double puede almacenar con precisión entre 15 y 16 dígitos en la parte fraccional

Entonces, doble puede almacenar el doble de la cantidad de parte fraccional que el flotador. Es por eso que Double se llama double the float


0

De acuerdo con IEEE754 • Estándar para almacenamiento en coma flotante • Estándares de 32 y 64 bits (precisión simple y precisión doble) • Exponente de 8 y 11 bits respectivamente • Formatos extendidos (mantisa y exponente) para resultados intermedios


-3

El número de precisión simple usa 32 bits, con MSB como bit de signo, mientras que el número de precisión doble usa 64 bits, MSB es bit de signo

Precisión simple

SEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

Precisión doble:

SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.