2012-10-14 3 views
8

मैं स्कैला को कुछ सी कोड पोर्ट कर रहा हूं, जो फ्लोटिंग पॉइंट अंकगणित का व्यापक उपयोग करता है। मैं सी संस्करण की एक कॉपी/पेस्ट के आधार पर स्काला में निम्नलिखित कोड लिखा है:संलग्न कोष्ठक के अतिरिक्त इस स्कैला अभिव्यक्ति के परिणाम को क्यों बदलता है?

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

परिणामस्वरूप मूल्य वास्तव में सी संस्करण से मेल खाता है। ऐसा लगता है कि संचालन का क्रम भिन्न होना चाहिए जब वहां नहीं होने पर ब्रांड्स को संलग्न कर रहे हों, लेकिन मुझे समझ में नहीं आता कि इससे कोई फर्क क्यों पड़ता है। कोई विचार क्या हो रहा है?

+1

अजीब। एक दोष? जब तक आप एक सरल अभिव्यक्ति प्राप्त नहीं करते हैं, तब तक आप अभिव्यक्ति को धीरे-धीरे सरल बनाने की कोशिश क्यों नहीं करते? उदाहरण के लिए '2640.96e-6 * पाप (एफ 5) + 63.52e-6 * पाप (2.0 * एफ 5) 'एक विसंगति देता है? क्या होगा यदि आप पहली अवधि के गुणांक को हटा दें? –

+1

(आप कर सकते थे भी उत्सर्जित बाईटकोड को देखकर यह (x86 कोडांतरक को देख की तरह नहीं है, हालांकि बेशक यह दूर नहीं है) की कोशिश करो। यह रूप में डरावना के रूप में यह लग रहा है नहीं है।। हालांकि एक सरल पहली अभिव्यक्ति प्राप्त करने का प्रयास है, तो बाईटकोड अपेक्षाकृत है । कम मुझे लगता है यह complimentaryTerms की अनुमानित प्रकार से कोई लेना देना कुछ –

+0

(हममम, आप भी आजमा सकते हैं 'println complimentaryTerms.getClass()', और देखें कि क्या यह एक ही है या नहीं –

उत्तर

14

यह अर्धविराम अनुमान के कारण है। नमूना (//; - inferred अर्धविराम):

val x = 1 //; 
     + 1 //; 
println(x) // 1 

और कोष्ठकों के साथ:

val x = (1 
     + 1) //; 
println(x) // 2 

या पीछा के साथ "+":

val x = 1 + 
     1 //; 
println(x) // 2 

अर्धविराम अनुमान
के नियमों एक लाइन समाप्ति को अर्धविराम के रूप में माना जाता है जब तक ओ निम्नलिखित शर्तों के ne सत्य है:

  1. प्रश्न में लाइन एक शब्द है कि इस तरह के एक अवधि या एक इन्फ़िक्स ऑपरेटर के रूप में एक बयान, के अंत के रूप में कानूनी नहीं होगा समाप्त होता है।

  2. अगली पंक्ति में एक शब्द है कि एक बयान प्रारंभ नहीं कर सकता साथ शुरू होता है।

  3. पंक्ति को समाप्त करते हुए अंदर कोष्ठक (...) या कोष्ठक [...], क्योंकि इन कई बयानों वैसे भी नहीं हो सकते।

+0

खैर देखा। और नियम तो उचित लगता है। और फिर भी .... इस बग पूरी तरह से गैर स्पष्ट है। मैं यह स्पष्ट हो जाता दूसरा लगता है समय आप इस बग में आते हैं? –

+2

यह भी त्रुटि नहीं करता है क्योंकि 'unary_ +' और 'unary_-'विधियां हैं, यानी तथ्य यह है कि' 1.1' मान्य अभिव्यक्ति है लेकिन (उदाहरण के लिए) '* 1.1' isn टी –

+0

हां, मैं इसके बारे में उल्लेख करना भूल गया। –

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