हास्केल में `मॉड` और` रेम` के बीच अंतर


130

हास्केल में modऔर वास्तव में क्या अंतर है rem?

दोनों एक ही परिणाम देने लगते हैं

*Main> mod 2 3
2
*Main> rem 2 3
2
*Main> mod 10 5
0
*Main> rem 10 5
0
*Main> mod 1 0
*** Exception: divide by zero
*Main> rem 1 0
*** Exception: divide by zero
*Main> mod 1 (-1)
0
*Main> rem 1 (-1)
0

3
हास्केल को नहीं जानते, लेकिन संभावना है कि ये एक ही ऑपरेशन हैं। ulus mod== remainder।
मैथ्यू शार्ले

निष्पक्ष होना, यह एक ही सवाल नहीं था। दूसरे प्रश्न ने इस प्रश्न के उत्तर की समझ को ग्रहण किया।
दान बर्टन

@ उस प्रश्न को पढ़ना, क्योंकि मेरे एक और प्रश्न के कारण ( stackoverflow.com/questions/5892188/… ), मुझे उसी का एहसास हुआ: /
ऑस्कर मेडेरोस

2
यह उसी तरह के बीच का अंतर है divऔरquot
newacct

जवाबों:


181

दूसरे तर्क नकारात्मक होने पर वे समान नहीं हैं:

2 `mod` (-3)  ==  -1
2 `rem` (-3)  ==  2

20
मेरे बारे में remऔर modक्लोजर में एक ही सवाल था, और यह जवाब था।
नूह

11
न ही वे पहले तर्क नकारात्मक होने पर समान हैं। इन पेचीदा कार्यों के बारे में कुछ और जानकारी के लिए देखें stackoverflow.com/a/8111203/1535283 और stackoverflow.com/a/339823/1535283
स्कॉट ओल्सन

4
इसके अलावा stackoverflow.com/a/6964760/205521 से ऐसा लगता है कि remयह सबसे तेज है।
थॉमस अहले

16
हालांकि यह उत्तर सही है, एक प्रश्न "क्या समान है" से अधिक नहीं का दावा करने वाला उत्तर "क्या अंतर है" बहुत बुरा है। यदि आप "कैसे" पर विस्तार कर सकते हैं तो मैं इसका स्वागत करूंगा कि वे अलग हैं और संभवत: कुछ यूसेकसी।
पोइट्रोए

59

हां, वे कार्य अलग तरह से कार्य करते हैं। जैसा कि आधिकारिक दस्तावेज में परिभाषित किया गया है :

quot पूर्णांक विभाजन शून्य की ओर छोटा होता है

rem पूर्णांक शेष है, संतोषजनक:

(x `quot` y)*y + (x `rem` y) == x

div पूर्णांक विभाजन ऋणात्मक अनंत की ओर छोटा होता है

mod पूर्णांक मापांक है, संतोषजनक:

(x `div` y)*y + (x `mod` y) == x

जब आप दूसरे पैरामीटर के रूप में एक ऋणात्मक संख्या का उपयोग करते हैं और परिणाम शून्य नहीं होता है, तो आप वास्तव में अंतर देख सकते हैं:

5 `mod` 3 == 2
5 `rem` 3 == 2

5 `mod` (-3) == -1
5 `rem` (-3) == 2

(-5) `mod` 3 == 1
(-5) `rem` 3 == -2

(-5) `mod` (-3) == -2
(-5) `rem` (-3) == -2

 


आपका अंतिम चार उदाहरण शायद तुम क्या मतलब है, के बाद से नहीं कर रहे हैं modऔर remसहयोगी की तुलना में अधिक दृढ़ता से (-)। मैंने आपकी टिप्पणी संपादित कर दी है क्योंकि मैं इस टिप्पणी में मल्टी लाइन सामान नहीं डाल सकता हूं।
एरिक हेसेलिंक

1
@ ErikHesselink: आपने अपने संपादन में एक त्रुटि पेश की। (-5) `mod` 3 == 1
चेंग सूर्य

@ChengSun धन्यवाद, मैंने इसे ठीक कर दिया है। समीक्षा के बाद जीना चाहिए।
एरिक हेसेलिंक

16

व्यावहारिक रूप से बोल रहा हूँ:

क्या आप जानते हैं दोनों ऑपरेंड सकारात्मक रहे हैं, तो आप आमतौर पर इस्तेमाल करना चाहिए quot, remया quotRemदक्षता के लिए।

यदि आप नहीं जानते कि दोनों ऑपरेंड पॉजिटिव हैं, तो आपको यह सोचना होगा कि आप परिणाम कैसा दिखना चाहते हैं। आप शायद नहीं चाहते हैं quotRem, लेकिन आप भी नहीं चाहते हो सकता है divMod(x `div` y)*y + (x `mod` y) == xकानून एक बहुत अच्छा है, लेकिन नकारात्मक अनंत (नुथ शैली प्रभाग) की ओर विभाजन गोलाई अक्सर कम उपयोगी और है कि यह सुनिश्चित करने की तुलना में कम कुशल है 0 <= x `mod` y < y(इयूक्लिडियन प्रभाग)।


5

मामले में आप केवल विभाजन के लिए परीक्षण करना चाहते हैं, तो आपको हमेशा उपयोग करना चाहिए rem

अनिवार्य रूप x `mod` y == 0से के बराबर है x `rem` y == 0, लेकिन remकी तुलना में तेज है mod

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.