EDICIóN GENERAL

¿Por qué es 2 * (i * i) más rápido que 2 * i * i en Java? (Eng)

Llevo años pensando que en informática se estudia muy poco acerca del funcionamiento interno de los lenguajes de programación, y me parece preocupante la gran sorpresa que este problema supone, ya que es solo la punta del iceberg de un problema de verdad importante.
Estudio ingeniería de obras públicas y mis conocimientos de programación son ridículos, puedo programar más o menos bien en Fortran90, y un poco en C, pero tanto si hago desde una hoja de excell hasta un programa propio, ensayo primero la fórmula que vaya a implementar en el orden exacto que el programa siga (incluyendo subrutinas, como una raíz cuadrada).
Es importante ya que una simple operación como (a-b)/c, por ejemplo, puede dar un resultado muy distinto de (a/c) - (b/c), debido a la propagación del error de máquina. Esto sucede con mucha frecuencia, entre ciertos rangos de números según cada situación pueden darse facilmente errores de un 5%, y con rangos de operaciones muy concretas, el error será abismal.
Entiendo que esto se estudie a fondo solo para trabajar con bases de datos muy grandes o con cálculos que duren minutos o horas en un ordenador, pero debería darse un poco más cuando se estudian los lenguajes de programación para saber que el problema está ahí.
Dejo un ejemplo de ecuación problemática, puede probarse con la típica calculadora que se usa en la secundaria:
(10^60 )·[(a+x) - (a-x)]
a=1
x=10^-50
Esta operación con esos valores dará como resultado = 0 en una calculadora, en una hoja de cálculo, en java, y en casi cualquier otro lenguaje de programación, a pesar de que la solución analítica es 2·10^10. Me parece un problema importante que no se insista más en esto, luego todos a decir que el lenguaje es una mierda, mientras se programa como se programa, dando palos de ciego con respecto a las matemáticas.
#93 No se, creo que te estás liando un poco.
Lo que aquí se está exponiendo es la ligera mejora de rendimiento que supone factorizar la multiplicación del ejemplo propuesto dentro de un bucle en Java. Lo cual se debe probablemente a una mayor optimización del bytecode por parte del JIT al hacer el desenroscado del bucle (loop unrolling) en el primer caso, quizá por tener un stack separado como resultado de dicha factorización y no tener que hacer tantas llamadas a stack para conservar los resultados intermedios que generaría 2 * i * i
#99 Yo creo que no me he liado...
Yo he entendido perfectamente la mejora de rendimiento que se expone, pero ahora te pregunto, si cambiasemos el rango de esa ecuación, ¿podría esta mejora de rendimiento afectar al resultado? ¿Confiarías en el resultado de esa sencillísima fórmula?

menéame