2014-11-04 8 views
6

जावा 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 परीक्षण विफल रहता है। पाउ() के सख्त गणित संस्करण लगातार परिणाम पैदा करता है। मुझे हॉटस्पॉट जेआईटी को कुछ ऑप्टिमाइज़ेशन करने का संदेह है जो पाउ() के एक अलग कार्यान्वयन पर स्विच करते हैं, जो कुछ इनपुट मानों के लिए अलग-अलग परिणाम उत्पन्न करता है। एक गणितीय कार्य निर्धारक होना चाहिए और लगातार और पुनरुत्पादित परिणाम पैदा करना चाहिए।

क्या यह एक बग या सुविधा है?

उत्तर

8

मैं निम्नलिखित बग रिपोर्ट मिल गया है:

JDK-7021568 : Double.parseDouble() returns architecture dependent results

यह है कि यह एक फ्लोटिंग प्वाइंट JITed कोड बनाम व्याख्या कोड में थोड़ा अलग परिणाम देने आपरेशन की रिपोर्ट है कि में बहुत समान है।

समस्या को एक बग के रूप में चिह्नित किया गया है और इसे ठीक किया गया है। इस आधार पर मैं तर्क दूंगा कि जो भी आप देख रहे हैं वह भी एक बग है और ओरेकल को सूचित किया जाना चाहिए।

संबंधित मुद्दे

 संबंधित मुद्दे