2011-09-12 8 views
9

मैं कैसे रूबी के सापेक्ष संकार्य काम करता है के लिए एक सरल व्याख्या के लिए देख रहा हूँ की तुलना में और क्यों, रूबीमापांक संकार्य PHP के लिए

puts 4 % 3 # 1 
puts -4 % 3 # 2 <--why? 
puts -4 % -3 # -1 

में लेकिन PHP में:

<?php 

echo 4 % 3; # 1 
echo -4 % 3; # -1 
echo -4 % -3; # -1 

मेरे लिए लग रहा है जैसे -4% 3 वास्तव में 8% 3 है (8 4 और -4 के बीच अंतर है)।

+3

एक्स% वाई, जहां या तो एक्स या वाई नकारात्मक हैं के व्यवहार एक डिजाइन पसंद (जो "अपरिभाषित हो सकता है व्यवहार")। न कुछ ज्यादा, न कुछ कम। [पूर्णांक विभाजन] पर यह खंड (http://www.davidflanagan.com/2006/06/integer-division-and-negative-numbers.html) और टिप्पणियां अधिक अंतर्दृष्टि का कारण बन सकती हैं। आईआईआरसी ने रूबी में इस "अजीब व्यवहार" के कारण एमएल पर चर्चा की है। –

+1

यदि रूबी चीजें एक तरह से करता है, और PHP चीजें करता है, तो मान लें कि रुबी इसे सही तरीके से कर रही है! जे/के –

उत्तर

15

आपकी परिभाषा के आधार पर दोनों को सही माना जा सकता है। यदि a % n == r, तो यह है कि धारण करना चाहिए:

a == q*n + r 

जहां q == a/n

चाहे r सकारात्मक या नकारात्मक q के मान से निर्धारित है। तो अपने उदाहरण है, या तो की में:

-4 == -1*3 + (-1) // PHP 
-4 == -2*3 + 2  // Ruby 

दूसरे शब्दों में कहें करने के लिए, % की परिभाषा / की परिभाषा पर निर्भर करता है।

यहां तालिका भी देखें: http://en.wikipedia.org/wiki/Modulus_operator#Remainder_calculation_for_the_modulo_operation। आप देखेंगे कि यह विभिन्न प्रोग्रामिंग भाषाओं के बीच काफी भिन्न होता है।

+1

आह, इसने इसे मेरे लिए क्लिक किया: "% की परिभाषा /" की परिभाषा पर निर्भर करती है। धन्यवाद! – typeoneerror

-1

Wolfram Alpha के अनुसार, 2 सही है।

संपादित करें: ऐसा लगता है कि आपको यह पूछना चाहिए कि PHP इस तरह क्यों काम करता है?

संपादित 2: PHP इसे डिवीजन ए/बी से शेष के रूप में परिभाषित करता है। चाहे आप इसे एक बग, गलत, या चीजों को करने का एक अलग तरीका मानते हैं, मुझे लगता है। व्यक्तिगत रूप से, मैं पहले 2 के लिए जाता हूं।

+1

मैं अंतर के बारे में पूछ रहा हूं, जो सही नहीं है, इसलिए मुझे लगता है कि मैं पूछ रहा हूं कि PHP इस तरह क्यों काम करता है। कोई विचार? – typeoneerror

+3

@ केली: यह न तो एक बग है और न ही गलत है। –

6

Here's a snippetThe Ruby Programming Language से मैटज़ और डेविड फ्लानगन द्वारा विषय पर।

जब एक (लेकिन दोनों) ऑपरेंड के नकारात्मक है, रूबी लेकिन पूर्णांक विभाजन करता है और C, C++ जैसी भाषाओं की तुलना में अलग कार्यों के सापेक्ष, और जावा करना (के रूप में ही भाषाओं अजगर और Tcl)। उद्धरण -7/3 पर विचार करें। नकारात्मक अनंतता की ओर रुबी राउंड और रिटर्न -3। सी और संबंधित भाषा शून्य की तरफ शून्य और वापसी -2। रूबी में, -ए/बी एक/-बी के बराबर है लेकिन मेरा बराबर नहीं है - (ए/बी)।

मॉड्यूल ऑपरेशन की रूबी की परिभाषा भी सी और जावा से अलग है। रूबी में, -7% 3 है 2. सी और जावा में, परिणाम -1 इसके बजाए है। परिणाम की परिमाण अलग-अलग होती है, क्योंकि मात्रा भिन्न होती है। लेकिन परिणाम का संकेत भी अलग है। रुबी में, परिणाम के पर हस्ताक्षर हमेशा दूसरे ऑपरेंड का संकेत होता है। सी और जावा में, परिणाम का संकेत हमेशा पहले ऑपरेंड का संकेत होता है। (रूबी के शेष विधि सी सापेक्ष ऑपरेटर की तरह व्यवहार करता है।)

1

यह वास्तव में भाषा के पूर्णांक कास्टिंग/राउंडिंग के कार्यान्वयन के लिए निर्भर करता है।चूंकि वास्तविक समीकरण है:

a - (n * int(a/n)) 

यह समीकरण है कि अलग है की int(a/n) हिस्सा है। यदि a == -4 और n == 3, PHP -1 लौटाएगा, जबकि रूबी -2 का उत्पादन करेगा। अब समीकरण रूबी में इस तरह दिखता है:

-4 - (3 * -2) 

और इस पीएचपी

में
-4 - (3 * -1) 
संबंधित मुद्दे