Math.pow produce resultados diferentes en llamadas repetidas

Después de actualizar a Java 1.8.0_20, nuestro sistema de prueba informó errores, pero el código no se modificó. Descubrí queMath.pow() invocado con exactamente los mismos parámetros de entrada produce resultados diferentes en llamadas repetidas. En Java 1.8.0_11 se comporta como se esperaba y devuelve siempre el mismo valor, pero con Java 1.8.0_20 y superior a veces devuelve valores ligeramente diferentes.

Esto es similar a la preguntaMath.pow produce resultados diferentes según la versión de Java, pero diferente porque los resultados de pow () difieren dentro de una VM.

La siguiente prueba JUint falla cuando se ejecuta en Java 1.8.0_20 y superior

import static org.junit.Assert.assertEquals;

import java.util.function.BiFunction;

import org.junit.BeforeClass;
import org.junit.Test;

public class PowerTest {

    private static final int N = 1000000;
    private static final double base = 5350.456329377186;
    private static final double exp = 2.0;

    private static double eval(final BiFunction<Double, Double, Double> f) {
        return f.apply(base, exp);
    }

    private void loop(final BiFunction<Double, Double, Double> f) {
        final double x = eval(f);
        for (int i = 0; i < N; i++) {
            final double p = eval(f);
            assertEquals("i=" + i, x, p, 0);
        }
    }

    @BeforeClass
    public static void info() {
        System.out.println("Java " + System.getProperty("java.version"));
    }

    @Test
    public void mathPow() {
        loop(Math::pow);
    }

    @Test
    public void strictMathPow() {
        loop(StrictMath::pow);
    }
}

La prueba no falla en Java 1.8.0_11 o si el punto de acceso se desactiva con-Xint. La versión matemática estricta de pow () produce resultados consistentes. Sospecho que el hotspot JIT hace algunas optimizaciones que cambian a una implementación diferente de pow (), lo que arroja resultados diferentes para ciertos valores de entrada. Una función matemática debe ser determinista y producir resultados consistentes y reproducibles.

¿Es esto un error o una característica?

Respuestas a la pregunta(2)

Su respuesta a la pregunta