अजगर में अंतर रूपांतरण के लिए पूर्णांक विभाजन और फ्लोट के बीच अंतर का कारण क्या है?


52

मैंने हाल ही में नोटिस किया है कि int()राउंड 0 की ओर एक फ्लोट करता है, जबकि पूर्णांक विभाजन अपनी मंजिल की ओर एक फ्लोट राउंड करता है।

उदाहरण के लिए:

-7 // 2 = -4
int(-7/2) = -3

मैंने वह दस्तावेज पढ़ा है जो निर्दिष्ट करता है:

कक्षा इंट (x, आधार = 10)

किसी संख्या या स्ट्रिंग x से निर्मित पूर्णांक ऑब्जेक्ट लौटाएं या कोई तर्क दिए जाने पर 0 लौटाएँ। यदि x एक संख्या है, तो x लौटाएं। int ()। फ्लोटिंग पॉइंट नंबरों के लिए, यह शून्य की ओर बढ़ता है।

तथा:

मंजिल विभाजन

गणितीय विभाजन जो निकटतम पूर्णांक तक गोल होता है। फ्लोर डिवीजन ऑपरेटर // है। उदाहरण के लिए, फ्लोट ट्रू डिवीजन द्वारा लौटाए गए 2.75 के विपरीत अभिव्यक्ति 11 // 4 का मूल्यांकन 2 है। ध्यान दें कि (-11) // 4 -3 है, क्योंकि यह -2.75 नीचे की ओर गोल है। पीईपी 238 देखें।

लेकिन यह मेरे लिए अतार्किक लगता है कि 2 समान ऑपरेशन (पूर्णांक से फ्लोट डिवीजन) अलग-अलग परिणाम लौटाए।

क्या कार्यों के बीच अंतर के लिए कोई प्रेरणा है?

धन्यवाद।


प्रासंगिक लिंक: python-history.blogspot.com/2010/08/…
dan04

जवाबों:


61

संगति।

आपको इसे समझने के लिए कुछ बहुत ही बुनियादी और प्रतीत होने वाली अप्रासंगिक व्याख्याओं का पालन करने की आवश्यकता होगी।

स्कूल में आपने एक शेष के साथ विभाजन सीखा है। और आप इस तरह से गणना कर चुके हैं:

8 ÷ 4 = 2 R 0
7 ÷ 4 = 1 R 3
6 ÷ 4 = 1 R 2
5 ÷ 4 = 1 R 1
4 ÷ 4 = 1 R 0
3 ÷ 4 = 0 R 3
2 ÷ 4 = 0 R 2
1 ÷ 4 = 0 R 1
0 ÷ 4 = 0 R 0
        ^------ This is the result of x // 4
            ^-- This is the result of x % 4 (modulo)

बाद में, आपने वास्तविक संख्याओं के लिए विभाजन सीखे:

8 ÷ 4 = 2.0
7 ÷ 4 = 1.75
6 ÷ 4 = 1.5
5 ÷ 4 = 1.25
4 ÷ 4 = 1.0
3 ÷ 4 = 0.75
2 ÷ 4 = 0.5
1 ÷ 4 = 0.25
0 ÷ 4 = 0.0
        ^--- Note that the number in front of the . is int(x/4)

इस बिंदु तक, आप यह मान सकते हैं कि x // 4और int(x/4)हमेशा वही परिणाम देते हैं। यह स्थिति की आपकी वर्तमान समझ है।

हालाँकि, पूर्णांक विभाजन में क्या होता है, इस पर ध्यान दें: 3, 2, 1 से 0 तक आर चक्रों के पीछे की संख्या और फिर से शुरू होती है: 3, 2, 1, 0. आर के सामने की संख्या हर 4 वें चरण को घटाती है।

तो, यह कैसे चलेगा?

 8 ÷ 4 =  2 R 0
 7 ÷ 4 =  1 R 3
 6 ÷ 4 =  1 R 2
 5 ÷ 4 =  1 R 1
 4 ÷ 4 =  1 R 0
 3 ÷ 4 =  0 R 3
 2 ÷ 4 =  0 R 2
 1 ÷ 4 =  0 R 1
 0 ÷ 4 =  0 R 0
-1 ÷ 4 = -1 R 3
         ^------ We have to decrease now, because we already have 0 four times
              ^-- We have to restart the cycle at 3

उसी समय, वास्तविक संख्या विभाजन हमें देता है:

-1 ÷ 4 = -0.25
          ^----- There is still a 0 in front of the .

इसलिए -1 // 4-1 int(-1/4)देता है लेकिन 0 देता है।

क्या कार्यों के बीच अंतर के लिए कोई प्रेरणा है?

खैर, वे विभिन्न उद्देश्यों की सेवा करते हैं: //अवशेषों के साथ पूर्णांक गणना का हिस्सा है और int()आपको .वास्तविक संख्या ऑपरेशन के सामने का हिस्सा देता है ।

आप तय करते हैं कि आप क्या गणना करना चाहते हैं, फिर आप तय करते हैं कि सही परिणाम प्राप्त करने के लिए पायथन में किस ऑपरेटर का उपयोग करना है।

अच्छा प्रश्न। सीखते रहो।


11
व्यवहार में, यह एक चाल के लिए अनुमति देता है: यदि आपके पास -1 मिठाई है और आप इसे 4 दोस्तों को देते हैं, तो 3 मिठाई शेष हैं। महान, है ना? आपको केवल यह पता लगाना होगा कि -1 मिठाई के मालिक कैसे हैं।
थॉमस वेलर

1
यह किसी प्रकार की निरंतरता पैदा करता है, जहां तक ​​मैं समझता हूं कि //अजगर 3 में ऑपरेटर को जोड़ने की प्रेरणा int (फ्लोट) के उपयोग से बचने के लिए है। यदि यह मामला नहीं है, तो मुझे कब उपयोग करना चुनना int()चाहिए और कब उपयोग करना चाहिए//
इसहाकज

1
ठीक है, तो यह सिर्फ एक गलत धारणा है। यह कुछ भी बुरा नहीं है, जब तक आप शुद्धता के लिए अपनी मान्यताओं का परीक्षण करते हैं, जो शायद 50% मामलों में विफल रहता है (कम से कम यह मेरे लिए ऐसा करता है)। मैंने उत्तर में इसके बारे में कुछ शब्द जोड़े।
थॉमस वेलर

2
@IsaacDj आप "फ्लोर डिवीजन" ऑपरेटर के पीछे की कहानी के लिए इसे पढ़ना चाह सकते हैं ।
ब्रूनो डेस्टहिलियर्स

1
@ EricLippert: मुझे नहीं लगता कि यह विचित्र है। हम यह नहीं मान सकते हैं कि एक सटीक संचालन एक सटीक ऑपरेशन के लिए एक ही परिणाम प्रदान करता है। कोड में बात की: Math.Floor(3.23) != -Math.Floor(-3.23)एक ही कारण के लिए -((-x)//y)बराबर की जरूरत नहीं है x//y
थॉमस वेलर

4

मैं कहूंगा कि आपका अवलोकन यह है कि उन 2 परिचालनों को सहज रूप से समान होना चाहिए क्योंकि वे सकारात्मक संख्याओं पर समान रूप से व्यवहार करते हैं। लेकिन यदि आप उनके मूल (एक गणित से और दूसरा कंप्यूटर विज्ञान से आते हैं) को देखते हैं तो यह उनके अलग व्यवहार को अधिक समझ में आता है।

आप वहाँ अवधारणाओं के पीछे देख सकते हैं:

  • फ्लोर डिवीजन उर्फ ​​फ्लोर फंक्शन गणित विभाग में लागू होता है
  • टाइप रूपांतरण / टाइप कास्टिंग

================================================== ================

I) फ्लोर डिवीजन उर्फ ​​फ्लोर फंक्शन गणित विभाग में लागू होता है

फर्श फ़ंक्शन गणित में एक बहुत अच्छी तरह से स्थापित अवधारणा है।

से mathworld.wolfram :

फर्श फ़ंक्शन | _ x_ |, जिसे सबसे बड़ा पूर्णांक फ़ंक्शन या पूर्णांक मान (स्पैनियर और ओल्डहैम 1987) भी कहा जाता है, सबसे बड़ा पूर्णांक x से कम या बराबर देता है। फर्श समारोह का नाम और प्रतीक केई इवरसन (ग्राहम एट अल 1994) द्वारा गढ़ा गया था।

इसलिए फ्लोर डिवीजन गणित विभाग में लागू फ्लोर फंक्शन से ज्यादा कुछ नहीं है। व्यवहार बहुत स्पष्ट है, "गणितीय रूप से सटीक"।

II) टाइप रूपांतरण / टाइप कास्टिंग

से विकिपीडिया :

कंप्यूटर विज्ञान में, टाइप कन्वर्शन, टाइप कास्टिंग, टाइप कॉर्शन और टाइप जुगलिंग एक डेटा टाइप से दूसरे में एक्सप्रेशन बदलने के अलग-अलग तरीके हैं।

प्रोग्रामिंग की अधिकांश भाषाओं में, पूर्णांक नियम के लिए फ़्लोटिंग नियम नियम द्वारा लागू किया जाता है (इसलिए एक सम्मेलन है):

  • 0 की ओर गोल - शून्य की ओर निर्देशित गोलाई (जिसे ट्रंकेशन भी कहा जाता है)

IEEE 754 के अनुसार गोलाई नियम ।


तो, दूसरे शब्दों में, पूर्णांक विभाजन और फ्लोट में अंतर रूपांतरण के लिए अजगर में अंतर का कारण एक गणितीय है, यहां गुइडो वैन रोसुम के कुछ विचार हैं (मुझे लगता है कि मुझे उसका परिचय नहीं देना है: डी) ब्लॉग पाइथन का इतिहास, लेख "व्हाई पाइथन इंटर्जर डिविजन फ्लोर" )

यह कुछ लोगों को परेशान करता है, लेकिन एक अच्छा गणितीय कारण है। पूर्णांक विभाजन ऑपरेशन (//) और इसकी सिबलिंग, मोडुलो ऑपरेशन (%), एक साथ चलते हैं और एक अच्छे गणितीय संबंध को संतुष्ट करते हैं (सभी चर पूर्णांक हैं):

a / b = q शेष r के साथ

ऐसा है कि

b * q + r = a और 0 <= r <b

(ए और बी मान रहे हैं = = 0)।

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