मैं स्कैला को कुछ सी कोड पोर्ट कर रहा हूं, जो फ्लोटिंग पॉइंट अंकगणित का व्यापक उपयोग करता है। मैं सी संस्करण की एक कॉपी/पेस्ट के आधार पर स्काला में निम्नलिखित कोड लिखा है:संलग्न कोष्ठक के अतिरिक्त इस स्कैला अभिव्यक्ति के परिणाम को क्यों बदलता है?
val complimentaryTerms = 2640.96e-6 * sin (f5)
+ 63.52e-6 * sin (2.0 * f5)
+ 11.75e-6 * sin (2.0 * f3 - 2.0 * f4 + 3.0 * f5)
+ 11.21e-6 * sin (2.0 * f3 - 2.0 * f4 + f5)
- 4.55e-6 * sin (2.0 * f3 - 2.0 * f4 + 2.0 * f5)
+ 2.02e-6 * sin (2.0 * f3 + 3.0 * f5)
+ 1.98e-6 * sin (2.0 * f3 + f5)
- 1.72e-6 * sin (3.0 * f5)
- 0.87e-6 * t * sin (f5)
इस गणना का परिणाम क्या सी संस्करण का उत्पादन से थोड़ा है। हालांकि, अगर मैं कोष्ठक में अभिव्यक्ति, इस तरह संलग्न:
val complimentaryTerms = (2640.96e-6 * sin (f5)
+ 63.52e-6 * sin (2.0 * f5)
+ 11.75e-6 * sin (2.0 * f3 - 2.0 * f4 + 3.0 * f5)
+ 11.21e-6 * sin (2.0 * f3 - 2.0 * f4 + f5)
- 4.55e-6 * sin (2.0 * f3 - 2.0 * f4 + 2.0 * f5)
+ 2.02e-6 * sin (2.0 * f3 + 3.0 * f5)
+ 1.98e-6 * sin (2.0 * f3 + f5)
- 1.72e-6 * sin (3.0 * f5)
- 0.87e-6 * t * sin (f5))
परिणामस्वरूप मूल्य वास्तव में सी संस्करण से मेल खाता है। ऐसा लगता है कि संचालन का क्रम भिन्न होना चाहिए जब वहां नहीं होने पर ब्रांड्स को संलग्न कर रहे हों, लेकिन मुझे समझ में नहीं आता कि इससे कोई फर्क क्यों पड़ता है। कोई विचार क्या हो रहा है?
अजीब। एक दोष? जब तक आप एक सरल अभिव्यक्ति प्राप्त नहीं करते हैं, तब तक आप अभिव्यक्ति को धीरे-धीरे सरल बनाने की कोशिश क्यों नहीं करते? उदाहरण के लिए '2640.96e-6 * पाप (एफ 5) + 63.52e-6 * पाप (2.0 * एफ 5) 'एक विसंगति देता है? क्या होगा यदि आप पहली अवधि के गुणांक को हटा दें? –
(आप कर सकते थे भी उत्सर्जित बाईटकोड को देखकर यह (x86 कोडांतरक को देख की तरह नहीं है, हालांकि बेशक यह दूर नहीं है) की कोशिश करो। यह रूप में डरावना के रूप में यह लग रहा है नहीं है।। हालांकि एक सरल पहली अभिव्यक्ति प्राप्त करने का प्रयास है, तो बाईटकोड अपेक्षाकृत है । कम मुझे लगता है यह complimentaryTerms की अनुमानित प्रकार से कोई लेना देना कुछ –
(हममम, आप भी आजमा सकते हैं 'println complimentaryTerms.getClass()', और देखें कि क्या यह एक ही है या नहीं –