जावा 1.8.0_20 में अपग्रेड करने के बाद हमारे परीक्षण सिस्टम ने त्रुटियों की सूचना दी, लेकिन कोड नहीं बदला गया था। मुझे पता चला कि Math.pow()
बिल्कुल उसी इनपुट पैरामीटर के साथ बुलाया जाता है जो दोबारा कॉल पर अलग-अलग परिणाम देता है। जावा 1.8.0_11 में यह अपेक्षित व्यवहार करता है और हमेशा एक ही मान देता है, लेकिन जावा 1.8.0_20 के साथ और इसके बाद कभी-कभी थोड़ा अलग मान देता है।Math.pow बार-बार कॉल पर विभिन्न परिणाम उत्पन्न करता है
यह Math.pow yields different result depending on java version प्रश्न के समान है, लेकिन अलग है क्योंकि पाउ() के परिणाम एक वीएम के भीतर भिन्न होते हैं। जब जावा 1.8.0_20 के तहत चलाने के लिए और अधिक
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);
}
}
टेस्ट जावा 1.8.0_11 तहत असफल नहीं है या अगर हॉटस्पॉट -Xint
साथ की कर दिया है
निम्नलिखित JUint परीक्षण विफल रहता है। पाउ() के सख्त गणित संस्करण लगातार परिणाम पैदा करता है। मुझे हॉटस्पॉट जेआईटी को कुछ ऑप्टिमाइज़ेशन करने का संदेह है जो पाउ() के एक अलग कार्यान्वयन पर स्विच करते हैं, जो कुछ इनपुट मानों के लिए अलग-अलग परिणाम उत्पन्न करता है। एक गणितीय कार्य निर्धारक होना चाहिए और लगातार और पुनरुत्पादित परिणाम पैदा करना चाहिए।
क्या यह एक बग या सुविधा है?