2016-08-23 10 views
5

इस पर विचार करें (सभी आदेशों एक 64 बिट आर्क Linux सिस्टम पर चलना):4 अलग-अलग भाषाएं 4 अलग-अलग परिणाम क्यों देती हैं?

  • पर्ल (v5.24.0)

    $ perl -le 'print 10190150730169267102/1000%10' 
    6 
    
  • awk (जीएनयू Awk 4.1.3)

    $ awk 'BEGIN{print 10190150730169267102/1000%10}' 
    6 
    
  • आर (3.3.1)

    > (10190150730169267102/1000)%%10 
    [1] 6 
    
  • bc

    $ echo 10190150730169267102/1000%10 | bc 
    7 
    
  • अजगर 2 (2.7.12)

    >>> print(10190150730169267102/1000%10) 
    7 
    
  • अजगर 3 (3.5.2)

    >>> print(10190150730169267102/1000%10) 
    8.0 
    

तो, पर्ल, gawk और R सहमत हैं, bc और पायथन 2 के रूप में। फिर भी, 6 औजारों के परीक्षण के बीच, मुझे 4 अलग-अलग परिणाम मिल गए। मैं समझता हूं कि इस बात के साथ कुछ करना है कि कितने लंबे पूर्णांक गोल किए जा रहे हैं, लेकिन विभिन्न उपकरण अलग-अलग क्यों होते हैं? मुझे उम्मीद थी कि यह प्रोसेसर की बड़ी संख्या से निपटने की क्षमता पर निर्भर करेगा, लेकिन ऐसा लगता है कि यह भाषा की आंतरिक विशेषताओं (या बग) पर निर्भर करता है।

कोई व्यक्ति यहां बताए गए दृश्यों के पीछे क्या हो रहा है? प्रत्येक भाषा में सीमाएं क्या हैं और वे काफी अलग तरीके से क्यों व्यवहार करते हैं?

+0

लघु अवधि में ओवरफ़्लो और aproximations। –

+0

@ जॉन डू ओके, लेकिन इतना बड़ा अंतर क्यों? – terdon

+0

आर में यह स्पष्ट है, मुझे लगता है कि ऐसा इसलिए है क्योंकि '%%' '/' से अधिक प्राथमिकता है। पायथन में, '101 9 0150730169267102/1000' एक बड़ी संख्या है, मुझे लगता है कि यह छोटा हो गया है या कुछ .. – Maroun

उत्तर

9

आप दो कारणों के लिए अलग-अलग परिणाम देख रहे हैं:

  1. विभाजन कदम दो अलग बातें कर रही है: में भाषाओं आप की कोशिश की के कुछ है, यह पूर्णांक विभाजन है, जो आंशिक भाग को छोड़ देता है का प्रतिनिधित्व करता है परिणाम का और केवल पूर्णांक भाग रखता है। दूसरों में यह वास्तविक गणितीय विभाजन का प्रतिनिधित्व करता है (जो पाइथन की शब्दावली के बाद मैं नीचे "सच्चा विभाजन" कहूंगा), एक वास्तविक फ़्लोटिंग पॉइंट परिणाम को वास्तविक मात्रा के करीब लौटाता है।

  2. कुछ भाषाओं में (मनमानी परिशुद्धता के लिए समर्थन वाले) में, बड़ी संख्यात्मक मान 10190150730169267102 बिल्कुल प्रदर्शित किया जा रहा है; दूसरों में, यह निकटतम प्रतिनिधित्व करने योग्य फ़्लोटिंग-पॉइंट मान द्वारा प्रतिस्थापित किया जाता है। 1. और 2 में संभावनाओं की

विभिन्न संयोजनों ऊपर आप विभिन्न परिणाम देते हैं।

विस्तार से: पर्ल, अजीब, और आर में, हम फ़्लोटिंग-पॉइंट मानों और सच्चे विभाजन के साथ काम कर रहे हैं। एक मशीन पूर्णांक में स्टोर करने के लिए मूल्य 10190150730169267102 बहुत बड़ा है, इसलिए यह सामान्य आईईईई 754 बाइनरी 64 फ्लोटिंग-पॉइंट प्रारूप में संग्रहीत है। वह प्रारूप उस विशेष मूल्य का बिल्कुल प्रतिनिधित्व नहीं कर सकता है, इसलिए संग्रहीत किया जाता है निकटतम मूल्य उस प्रारूप में प्रतिनिधित्व योग्य है, जो 10190150730169266176.0 है। अब हम 1000 द्वारा अनुमानित रूप से विभाजित करते हैं, फिर एक फ़्लोटिंग-पॉइंट परिणाम देते हैं। सटीक मात्रात्मक, 10190150730169266.176, फिर से बाइनरी 64 प्रारूप में बिल्कुल प्रतिनिधित्व योग्य नहीं है, और हमें निकटतम प्रतिनिधित्व करने योग्य फ्लोट मिलता है, जो 10190150730169266.0 होता है।शेष मॉड्यूलो 10 लेना 6 देता है।

बीसी और पायथन 2 में, हम मनमानी-परिशुद्धता पूर्णांक और पूर्णांक विभाजन के साथ काम कर रहे हैं। वे दोनों भाषाएं संख्यात्मक रूप से प्रतिनिधित्व कर सकती हैं। विभाजन परिणाम 10190150730169267 है (हम पूर्णांक विभाजन कर रहे हैं, सच विभाजन नहीं, इसलिए आंशिक भाग त्याग दिया गया है), और शेष मॉड्यूल 107 है। (यह थोड़ा अधिक है: प्रारूप जो बीसी आंतरिक रूप से उपयोग कर रहा है वह कुछ मनमानी-सटीक पूर्णांक प्रकार की तुलना में पाइथन के Decimal प्रकार के करीब कुछ है, लेकिन इस मामले में प्रभाव समान है।)

पायथन 3 में, हम मनमानी-परिशुद्धता पूर्णांक और सच्चे विभाजन के साथ काम कर रहे हैं। संख्यात्मक रूप से बिल्कुल प्रतिनिधित्व किया जाता है, लेकिन विभाजन का परिणाम वास्तविक भाग्य के निकटतम फ़्लोटिंग-पॉइंट मान है। इस मामले में सटीक भाग 10190150730169267.102 है, और निकटतम प्रतिनिधित्व करने योग्य फ़्लोटिंग-पॉइंट मान 10190150730169268.0 है। उस मान के शेष को लेना मॉड्यूलो 108 देता है।

सारांश:

  • पर्ल, awk, आर: फ्लोटिंग प्वाइंट अनुमानों, सच विभाजन
  • ई.पू., अजगर 2: मनमाना परिशुद्धता पूर्णांकों, पूर्णांक विभाजन
  • अजगर 3: मनमाना परिशुद्धता पूर्णांकों सच विभाजन
3

मैं अजगर 2 और अजगर 3. बीच अंतर के लिए केवल जवाब कर सकते हैं "/" अजगर 2 में पूर्णांक विभाजन, जबकि यह अजगर 3 में वास्तविक विभाजन (कि जहां अजगर 3 में .0 से आता है है। उत्पादन होता है तैरनेवाला स्थल।

संक्षेप में:

  • अजगर 2

    10190150730169267102/1000%10 
    

    के बराबर होती है

    10190150730169267%10 
    

    के बराबर होती है

    7 
    
  • अजगर 3

    10190150730169267102/1000%10 
    

    के बराबर होती है

    10190150730169267,102%10 
    

    7.102 
    

के बराबर होती है, लेकिन यह है, क्योंकि आंतरिक प्रतिनिधित्व के (गलत तरीके से) 8,0

को अभिकलन आप नोट कर सकते हैं कि सही जवाब 7 हो सकता है या 7.102 निर्भर करता है कि अगर हम विभाजन को फ़्लोटिंग पॉइंट या पूर्णांक मानते हैं। तो केवल पायथन (2) और बीसी के सही जवाब हैं। और पायथन 3 में पूर्णांक विभाजन (10190150730169267102//1000%10) के साथ सही उत्तर होगा।

पायथन का समर्थन करता है मनमाने ढंग से बड़े पूर्णांक मूल रूप से!

1
perl6 में

➜ ~ perl6 -e 'say(10190150730169267102 div 1000 mod 10)' 
7 
➜ ~ perl6 -e 'say(10190150730169267102/1000%10)' 
7.102 

इसलिए, यदि आप सुनिश्चित नहीं हैं कि कौन सी भाषा सही है, तो Perl6 से पूछने का प्रयास करें। :)

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