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

StackOverflow https://stackoverflow.com/questions/801117

Pregunta

¿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 punto flotante de doble precisión o solo una precisión única y, en general, se utilizan las capacidades de doble precisión (si existen)?

¿Fue útil?

Solución

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 no suelen requerir una mayor precisión de datos disponible con tipos de datos de 64 bits, así como el hecho de que el procesamiento de datos de 64 bits utiliza el doble RAM, caché y ancho de banda, lo que reduce el rendimiento general del sistema.

De Webopedia :

  

El término doble precisión es una especie de nombre 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á 64 bits de longitud.

     

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 aumentan la precisión y el rango de magnitudes depende del formato que esté utilizando el programa para representar valores de punto flotante.
  La mayoría de las computadoras usan un formato estándar conocido como formato de punto flotante IEEE.

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

Precisión única

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 signo bit, S,
  • los siguientes ocho bits son el exponente bits, '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<255 entonces V=(-1)**S * 2 ** (E-127) * (1.F) donde " 1.F " es destinado a representar el número binario creado al prefijar F con un 1 implícito y un punto binario.
  • Si E = 0 y F es distinto de cero, entonces V=(-1)**S * 2 ** (-126) * (0.F). Estas son " no normalizado " valores.
  • 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)

Doble precisión

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 signo bit, S,
  • los siguientes once bits son el exponente bits, '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<2047 entonces V=(-1)**S * 2 ** (E-1023) * (1.F) donde " 1.F " es destinado a representar el número binario creado al prefijar F con un 1 implícito y un punto binario.
  • Si E = 0 y F es distinto de cero, entonces V=(-1)**S * 2 ** (-1022) * (0.F) Estos son " no normalizado " valores.
  • 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:
Norma ANSI / IEEE 754-1985,
Estándar para aritmética de coma flotante binaria.

Otros consejos

Leí muchas respuestas, pero ninguna parece explicar correctamente de dónde proviene la palabra double . 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 representación de punto flotante de precisión individual 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 mantissa , o coeficiente (aunque solo 23 están representados). Llamémoslo 'M' (para mantissa , prefiero este nombre como & Quot; fracción & Quot; puede ser mal entendido).

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 punto flotante de precisión doble 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 mantissa 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 todos sus 0 no significativos. Por ejemplo,

  • 0.000124 se convierte en 0.124 & # 215; 10 & # 8722; 3
  • 237.141 se convierte en 0.237141 & # 215; 10 3

Esto significa que la mantisa siempre tendrá la forma

0. & # 945; 1 & # 945; 2 ... & # 945; t & # 215; βp

donde & # 946; Es la base de la representación. Pero como la fracción es un número binario, & # 945; 1 siempre será igual a 1, por lo que la fracción puede reescribirse como 1.. & # 945; 2 α3...αt+1 & # 215; 2 p y el 1 inicial se puede suponer implícitamente, dejando espacio para un bit extra (& # 945; t + 1 ).

Ahora, obviamente es cierto que el doble de 32 es 64, pero no es de ahí de donde proviene 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 tiene aproximadamente 15 ~ 16 dígitos decimales

Bien, la diferencia básica en la máquina es que la precisión doble usa el doble de bits que la única. En la implementación habitual, son 32 bits para simple, 64 bits para doble.

¿Pero qué significa eso ? 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 se encuentran en Wikipedia , como de costumbre.

Para agregar a todas las maravillosas respuestas aquí

En primer lugar, flotante y doble se utilizan 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 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   en otras palabras, indica cuántos dígitos decimales se pueden usar con seguridad .

Float puede almacenar con precisión alrededor de 7-8 dígitos en la parte fraccional mientras Double puede almacenar con precisión alrededor de 15-16 dígitos en la parte fraccional

Entonces, el flotador puede almacenar el doble de la cantidad de parte fraccional. Es por eso que Doble se llama doble el flotador

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 uso de generel es la capacidad de doble precisión utilizada (si existe?). quot;

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). La celda recibió soporte de doble punto flotante más adelante, pero estoy bastante seguro de que la PS3 no usa ese chip.

Básicamente precisión simple la aritmética de coma flotante trata con números de coma flotante de 32 bits mientras que doble precisión 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).

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 punto flotante de hardware, pero sigue ahí.

El N64 utilizó 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. Por lo tanto, 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 pueden no hacerlo debido al rendimiento. (aunque casi todo después de que el n64 usó un bus de 32 bits, así que ...)

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

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 exactamente 123.456789.

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

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)

Doble precisión:

SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top