valor que punto notación normalizada norma mantisa informatica flotante fija exponente coma floating-point sse2 x87

floating point - que - Doble punto flotante extendido(80 bits) en x87, no SSE2. ¿No lo extrañamos?



que es coma flotante en informatica (4)

El mayor problema con x87 es básicamente que todas las operaciones de registro se realizan en 80 bits, mientras que la mayoría de las personas solo usan flotadores de 64 bits (es decir, flotadores de doble precisión). Lo que sucede es que se carga un flotador de 64 bits en la pila x87 y se convierte en 80 bits. Realiza algunas operaciones en él en 80 bits, luego lo almacena de nuevo en la memoria, convirtiéndolo en 64 bits. Obtendrá un resultado diferente que si hubiera hecho todas las operaciones con solo 64 bits, y con un compilador de optimización puede ser muy impredecible la cantidad de conversiones que un valor puede pasar, por lo que es difícil verificar que está obteniendo el " respuesta correcta "al hacer pruebas de regresión.

El otro problema, que solo importa desde el punto de vista de alguien que escribe un ensamblado (o que escribe un ensamblaje indirectamente, en el caso de que alguien escriba un generador de código para un compilador), es que el x87 usa una pila de registros, mientras que el SSE usa accesibilidad individual registros Con x87 tiene un montón de instrucciones adicionales para manipular la pila, y me imagino que Intel y AMD preferirían que sus procesadores funcionen rápido con el código SSE que intentar que esas instrucciones adicionales de manipulación de pila x87 se ejecuten rápidamente.

Por cierto, si tiene problemas con la inexactitud, querrá ver el artículo " Lo que todo programador debería saber sobre aritmética de punto flotante ", y luego usar una biblioteca de matemáticas de precisión arbitraria (por ejemplo, GMP).

Hoy estuve leyendo sobre los investigadores que descubrieron que las bibliotecas Phys-X de NVidia usan x87 FP frente a SSE2 . Obviamente, esto será subóptimo para los conjuntos de datos paralelos donde la velocidad triunfe sobre la precisión. Sin embargo, el autor del artículo continúa citando:

Intel comenzó a desalentar el uso de x87 con la introducción del P4 a fines de 2000. AMD dejó de utilizar x87 desde el K8 en 2003, ya que x86-64 se define con el soporte de SSE2; El C7 de VIA es compatible con SSE2 desde 2005. En las versiones de Windows de 64 bits, x87 está en desuso para el modo de usuario y está prohibido por completo en el modo de kernel. Casi todo el mundo en la industria ha recomendado SSE sobre x87 desde 2005 y no hay razones para usar x87, a menos que el software tenga que ejecutarse en un Pentium incrustado o 486.

Me preguntaba acerca de esto. Sé que x87 utiliza internamente duplicados de 80 bits para calcular los valores, y SSE2 no lo hace. ¿Esto no le importa a nadie? Me parece sorprendente. Sé que cuando hago cálculos en puntos, líneas y polígonos en un plano, los valores pueden ser sorprendentemente erróneos cuando se hacen restas, y las áreas pueden colapsarse y las líneas se alian entre sí debido a la falta de precisión. El uso de valores de 80 bits frente a valores de 64 bits podría ayudar, me imagino.

¿Esto es incorrecto? De lo contrario, ¿qué podemos usar para realizar operaciones extendidas de doble FP si se elimina x87?


La doble precisión es de 11 bits menos que f80 (alrededor de 2.5 nibbles / dígitos), para muchas aplicaciones (en su mayoría juegos) no dolería. Pero necesitará toda la precisión disponible para, por ejemplo, programa espacial o aplicación médica.

Es un poco engañoso cuando algunos dicen que f80 (y desalentado por él) que opera en la pila. Registros de FPU y operaciones similares a la operación de pila, tal vez eso es lo que confunde a la gente. En realidad, se basa en la memoria (cargar / almacenar), no en la pila por sí misma, en comparación con, por ejemplo, la convención de llamadas como cdecl stdcall que realmente pasa parámetros a través de la pila. y nada de malo en eso.

La gran ventaja de SSE en realidad es la operación de serialización, 2, 4, 8 valores a la vez, con muchas operaciones Varian. Sí, puede transferir directamente al registro, pero transferirá esos valores a la memoria de todos modos al final.

La gran desventaja de f80 es que, con sus 10 bytes de longitud impar, interrumpe la alineación. tendrías que alinearlos 16 para un acceso más rápido. Pero en realidad no es practicable para array.

Todavía tiene que usar fpu para operaciones trigonométricas y otras operaciones matemáticas trancedentales. Para asm, hay muchos trucos de f80 que son realmente divertidos y útiles.

Para juegos y aplicaciones sencillas (casi todas), puedes usar el doble sin que muera alguien. Pero para algunas aplicaciones serias, matemáticas o científicas, simplemente no puedes deshacerte de f80.


La otra respuesta parece sugerir que usar una precisión de 80 bits es una mala idea, pero no lo es. Desempeña un papel a veces vital para mantener a raya la imprecisión, ver, por ejemplo, los escritos de W. Kahan.

Siempre use aritmética intermedia de 80 bits si puede salirse con la velocidad. Si eso significa que tienes que usar matemáticas x87, bueno, hazlo. El apoyo es omnipresente y mientras la gente siga haciendo lo correcto, seguirá siendo ubicuo.


Para hacer un uso adecuado de las matemáticas de precisión extendida, es necesario que un lenguaje admita un tipo que pueda usarse para almacenar el resultado de cálculos intermedios, y que pueda ser sustituido por las expresiones que producen esos resultados. Así, dado:

void print_dist_squared(double x1, double y1, double x2, double y2) { printf("%12.6f", (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); }

debe haber algún tipo que se pueda usar para capturar y reemplazar las subexpresiones comunes x2-x1 y y2-y1 , permitiendo que el código se reescriba como:

void print_dist_squared(double x1, double y1, double x2, double y2) { some_type dx = x2-x1; some_type dy = y2-y1; printf("%12.6f", dx*dx + dy*dy); }

Sin alterar la semántica del programa. Desafortunadamente, ANSI C no especificó ningún tipo que pudiera usarse para algún tipo en plataformas que realizan cálculos de precisión extendida, y se volvió mucho más común culpar a Intel por la existencia de tipos de precisión extendida que a la culpa del soporte fallido de ANSI.

De hecho, los tipos de precisión extendida tienen tanto valor en plataformas sin unidades de punto flotante como en procesadores x87, ya que en tales procesadores un cálculo como x + y + z implicaría los siguientes pasos:

  1. Descomprima la mantisa, el exponente y posiblemente el signo de x en registros separados (el exponente y el signo a menudo pueden ser "doble litera")
  2. Desembale y lo mismo.
  3. Desplace hacia la derecha la mantisa del valor con el exponente más bajo, si lo hubiera, y luego sume o reste los valores.
  4. En el caso de que x e y tengan signos diferentes, desplace a la izquierda la mantisa hasta que el bit más a la izquierda sea 1 y ajuste el exponente de manera apropiada.
  5. Empaquetar el exponente y la mantisa en formato doble.
  6. Desempaquetar el resultado temporal.
  7. Desembalar z.
  8. Desplace hacia la derecha la mantisa del valor con el exponente más bajo, si lo hubiera, y luego sume o reste los valores.
  9. En caso de que el resultado anterior yz tuvieran signos diferentes, desplace a la izquierda la mantisa hasta que el bit más a la izquierda sea 1 y ajuste el exponente adecuadamente.
  10. Empaquetar el exponente y la mantisa en formato doble.

El uso de un tipo de precisión extendida permitirá eliminar los pasos 4, 5 y 6. Dado que una mantisa de 53 bits es demasiado grande para caber en menos de cuatro registros de 16 bits o dos registros de 32 bits, realizar una adición con una mantisa de 64 bits no es más lento que usar una mantisa de 53 bits, así que usar la matemática de precisión extendida ofrece un cálculo más rápido sin inconvenientes en un lenguaje que admite un tipo adecuado para obtener resultados temporales . No hay ninguna razón para culpar a Intel por proporcionar una FPU que podría realizar cálculos de punto flotante de la manera que también fue el método más eficiente en chips que no son FPU.