c++ - punto - eps matlab significado
¿Es la cancelación catastrófica un problema al calcular productos de puntos de vectores de punto flotante? Y si es así, ¿cómo se aborda típicamente? (2)
Estoy escribiendo un simulador de física en C ++ y me preocupa la robustez. He leído que la cancelación catastrófica puede ocurrir en la aritmética de punto flotante cuando se calcula la diferencia de dos números de magnitud casi igual. Se me ocurrió que esto puede suceder en el simulador cuando se calcula el producto puntual de dos vectores casi ortogonales. Sin embargo, las referencias que he examinado solo discuten la solución del problema al reescribir la ecuación en cuestión (por ejemplo, la fórmula cuadrática puede reescribirse para eliminar el problema), ¿pero esto no parece aplicarse al calcular un producto puntual? Supongo que me interesaría saber si esto suele ser un problema en los motores de física y cómo se aborda.
Un truco común es hacer que la variable del acumulador sea un tipo con mayor precisión que los vectores en sí.
Alternativamente, uno puede usar la suma de Kahan al sumar los términos.
Otro enfoque es utilizar varios algoritmos de productos de puntos bloqueados en lugar del algoritmo canónico.
Por supuesto, uno puede combinar los dos enfoques anteriores.
Tenga en cuenta que lo anterior es un comportamiento de error general para los productos de puntos, no específicamente una cancelación catastrófica.
Usted dice en un comentario que tiene que calcular x1 * x2 + y1 * y2, donde todas las variables son flotantes. Entonces, si realiza el cálculo con precisión doble, no pierde ninguna precisión, ya que la precisión doble tiene más del doble de precisión que la flotación (suponiendo que su objetivo utilice IEEE-754 ).
Específicamente: sean xx, yy
los números reales representados por las variables float
x, y
. Deje que xxyy
sea su producto, y sea xy
el resultado de la multiplicación de doble precisión x * y
. Entonces, en todos los casos, xxyy
es el número real representado por xy
.