Math.pow liefert bei wiederholten Aufrufen unterschiedliche Ergebnisse

Nach dem Upgrade auf Java 1.8.0_20 hat unser Testsystem Fehler gemeldet, aber der Code wurde nicht geändert. Ich habe herausgefunden, dassMath.pow() called mit genau den gleichen Eingabeparametern liefert bei wiederholten Aufrufen unterschiedliche Ergebnisse. In Java 1.8.0_11 verhält es sich wie erwartet und gibt immer den gleichen Wert zurück. Ab Java 1.8.0_20 werden jedoch manchmal leicht unterschiedliche Werte zurückgegeben.

Dies ähnelt der Frage Math.pow liefert je nach Java-Version ein anderes Ergebnis, aber anders, da die Ergebnisse von pow () innerhalb einer VM unterschiedlich sind.

Der folgende JUint-Test schlägt fehl, wenn er unter Java 1.8.0_20 und höher ausgeführt wird.

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);
    }
}

Test schlägt unter Java 1.8.0_11 nicht fehl oder wenn der Hotspot mit @ ausgeschaltet wi-Xint. Die streng mathematische Version von pow () liefert konsistente Ergebnisse. Ich vermute, dass die Hotspot-JIT einige Optimierungen vornimmt, bei denen auf eine andere Implementierung von pow () umgeschaltet wird, die für bestimmte Eingabewerte unterschiedliche Ergebnisse liefert. Eine mathematische Funktion sollte deterministisch sein und konsistente und reproduzierbare Ergebnisse liefer

Ist das ein Fehler oder eine Funktion?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage