पायथन के math.ceil () और math.floor () ऑपरेशन पूर्णांक के बजाय फ्लोट क्यों लौटाते हैं?


170

क्या कोई इसे समझा सकता है ( डॉक्स से सीधे - जोर मेरा):

math.ceil (x) x की छत को फ्लोट के रूप में लौटाते हैं , सबसे छोटा पूर्णांक मान x से अधिक या उसके बराबर होता है।

math.floor (x) x का फर्श फ्लोट के रूप में लौटाता है , सबसे बड़ा पूर्णांक मान जो x के बराबर या उससे कम होता है।

जब वे पूर्णांकों की गणना करने वाले होते हैं तो वे क्यों लौटेंगे .ceilऔर .floorतैरेंगे?


संपादित करें:

खैर इसने कुछ बहुत अच्छे तर्क दिए कि क्यों उन्हें फ़्लोट्स लौटना चाहिए , और मुझे सिर्फ इस विचार की आदत थी, जब @jcollado ने बताया कि वे वास्तव में पायथन 3 में वापसी करते हैं ...


1
मेरा अनुमान है कि यह इसलिए है क्योंकि x एक फ्लोट है, एक पूर्णांक नहीं है, लेकिन जब से मैं पायथन को नहीं जानता या उपयोग नहीं करता, मैं किसी और को निश्चित रूप से उत्तर दूंगा। :)
एडम वी

6
@ एडम- लेकिन छत / फर्श के संचालन का पूरा बिंदु गोल से पूर्णांक तक तैरता है!
यारिन

1
यह भी मुझे पहली बार आया जब मैंने इसे पार किया, क्योंकि यह सिर्फ गलत लगता है। कम से कम, यह उपयोग करने के लिए बहुत मुश्किल नहीं है int(floor(n))
विम

1
विडंबना यह है (जैसा कि फ्लोट्स को ओवरफ्लो को रोकने के लिए इस्तेमाल किया गया था), फ्लोट प्रतिनिधित्व के कारण फर्श / छत द्वारा लौटाया गया मूल्य कम अंकों में अर्थहीन है, इससे पहले कि 64 बिट्स इंट ओवरफ्लो होगा। [यह 32 बिट्स के पुराने दिनों में सच नहीं था।]
यवेस डावाड

जवाबों:


99

फ्लोटिंग पॉइंट नंबरों की सीमा आमतौर पर पूर्णांकों की सीमा से अधिक होती है। फ़्लोटिंग पॉइंट मान वापस करके, फ़ंक्शन इनपुट मानों के लिए एक समझदार मान लौटा सकते हैं जो पूर्णांकों की प्रतिनिधित्व योग्य सीमा के बाहर स्थित हैं।

विचार करें: यदि floor()एक पूर्णांक लौटाया जाए , तो क्या करना चाहिएfloor(1.0e30) लौटना ?

अब, जबकि पायथन के पूर्णांक अब मनमानी परिशुद्धता हैं, यह हमेशा इस तरह नहीं था। मानक लायब्रेरी फ़ंक्शन समान C लाइब्रेरी फ़ंक्शंस के आसपास पतले रैपर हैं।


13
और भले ही पायथन पूर्णांक अब मनमाने ढंग से सटीक हैं, फिर भी ऐसी फ़्लोट्स हैं जिनके फर्श और छत को पूर्णांकों द्वारा प्रस्तुत नहीं किया जा सकता है। कोशिश करो floor(float("inf"))या ceil(float("nan"))
माइकल हॉफमैन

4
@ माइकल- P3 में स्पष्ट रूप से अब आप ओवरफ्लो एक्ससेप्शन प्राप्त करेंगे यदि आप ऐसा प्रयास करते हैं। देखें jcollado के जवाब
Yarin

4
एर, यह एक 'लंबी' प्रकार (उर्फ 'बिगिंट') लौटाना चाहिए, है ना? मेरे लिए एक स्पष्ट जवाब की तरह लगता है, लेकिन अब मुझे लगता है कि मैं किसी तरह भोली हूँ।
कोसची

3
@koschei: यह पायथन 3.x में है, जकोलाडो का उत्तर देखें।
ग्रेग हेविगिल

एक अन्य उत्तर के लिए एक टिप्पणी भी देखें कि यह उन संख्याओं के लिए भी क्यों समझ में आता है जो सीमा में हैं।
ivan_pozdeev

96

जैसा कि अन्य उत्तरों द्वारा बताया गया है, अजगर में वे अतिप्रवाह की समस्याओं को रोकने के लिए ऐतिहासिक कारणों के कारण शायद तैरते हैं। हालांकि, वे अजगर 3 में पूर्णांक लौटाते हैं।

>>> import math
>>> type(math.floor(3.1))
<class 'int'>
>>> type(math.ceil(3.1))
<class 'int'>

आप PEP 3141 में अधिक जानकारी प्राप्त कर सकते हैं ।


@ jcollado- आप कहाँ देखते हैं कि वे P3 में पूर्णांक लौटाते हैं?
यारिन

4
@ यारिन I ने केवल ऊपर दिए गए आदेश टाइप किए। इसके अलावा, यदि आप के साथ कोशिश करते हैं float("inf")या float("nan"), आप एक OverflowErrorअपवाद मिलेगा ।
जेकोलाडो

10
पूर्णता के लिए, पायथन numpy.floorऔर ceilरिटर्न फ्लोट्स (<वर्ग 'numpy.float64'>)
नील जी

1
@ जेकलाडो: float("inf")पायथन 2.7 या 3
एंडोलिथ

1
@endolith आप सही कह रहे हैं, मैंने इसकी जाँच कर ली है और यह अब नहीं होता है। संभवत: ऐसा कुछ है जिसे दिसंबर 2011 से बदल दिया गया है।
जेकलाडो

18

आपके भ्रम का स्रोत आपकी टिप्पणी में स्पष्ट है:

छत / फर्श के संचालन का पूरा बिंदु फ्लोट को पूर्णांक में बदलना है!

छत और फर्श के संचालन का बिंदु अभिन्न मूल्यों के लिए फ्लोटिंग-पॉइंट डेटा को गोल करना है । एक प्रकार का रूपांतरण करने के लिए नहीं। जिन उपयोगकर्ताओं को पूर्णांक मान प्राप्त करने की आवश्यकता होती है, वे ऑपरेशन के बाद एक स्पष्ट रूपांतरण कर सकते हैं।

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

इसके अतिरिक्त, आपके पास छत और फर्श के संस्करण होने चाहिए जो कि IEEE 754 के अनुरूप होने पर फ्लोटिंग-पॉइंट नंबर लौटाते हैं ।


स्टीफन- मैंने अपनी टिप्पणी फिर से लिखी है- मेरा मतलब गोल था, कन्वर्ट नहीं। लेकिन यह मेरी उलझन का स्रोत नहीं था- बल्कि यह था कि मैं सीमा असमानता को नहीं पहचान रहा था।
यारिन

अफसोस की बात है कि मैं आज वोटों से बाहर हूं। यह सही उत्तर है, प्रतिनिधित्व की किसी भी सीमा से बहुत अधिक।
मार्सिन

13
मेरी प्रोग्रामिंग के वर्षों में, मुझे कभी भी ऐसी स्थिति का सामना नहीं करना पड़ता है जहां मैं एक पूर्णांक के बजाय फर्श / छत का परिणाम एक फ्लोट होना चाहता था । तथ्य यह है कि python3 करता है वापसी पूर्णांकों से पता चलता है कि यह करने के लिए और अधिक उपयोगी बात वास्तव में है। मैं "... की बात" नहीं खरीदता; ऐसा लगता है कि आप उस बिंदु के आधार पर परिभाषित कर रहे हैं जो वह करता है, बजाय इसके कि एक प्रोग्रामर को क्या चाहिए।
श्रीवत्सआर

2
@ श्रीवत्सआर I उस स्थिति को एक-दो बार (हालांकि, मुख्य रूप से पायथन संदर्भ से बाहर) था। जब मुझे याद आता है कि मैंडलब्रॉट सेट के साथ काम कर रहे हैं। कभी-कभी आपको एक अभिन्न मूल्य बनाने की आवश्यकता होती है, लेकिन फिर बाद में मूल्य के लिए कुछ फ़्लोटिंग पॉइंट ऑपरेशन लागू करें (कहते हैं, इसे 0.5 से स्केल करें)। फिर यह फ्लोटेड फ्लोट को रखने के लिए बहुत अधिक कुशल है और पहले इसे एक इंट में परिवर्तित करने की तुलना में एक फ्लोटिंग पॉइंट ऑपरेशन लागू करता है और फिर तुरंत इसे फ़्लोट में वापस परिवर्तित करता है।
ब्लबरडाइबुल

17

क्योंकि अजगर की गणित पुस्तकालय सी गणित पुस्तकालय के चारों ओर एक पतली आवरण है जो तैरता है।


सी गणित पुस्तकालय मनमाने ढंग से सटीक पूर्णांक का समर्थन करता है? क्योंकि यही अन्य अजगर गणित कार्य लौटाता है।
एंडोलिथ

5

पाइथन 2.4 से पहले, एक पूर्णांक वास्तविक वास्तविक संख्याओं की पूरी श्रृंखला को पकड़ नहीं सकता था।

http://docs.python.org/whatsnew/2.4.html#pep-237-unifying-long-integers-and-integers


2
यह अब "पूर्ण रूप से काटे गए वास्तविक नंबरों की पूरी श्रृंखला" को धारण नहीं कर सकता, क्योंकि यह स्पष्ट रूप से एक अनंत सेट है और इसलिए इसे अनंत मात्रा में मेमोरी की आवश्यकता होगी। यह छंटनी वाली फ़्लोट्स की सीमा को पकड़ सकता है , जो कि the का एक छोटा उपसमूह है।
लेफ्टनैबाउटआउट

6
@leftractionabout - पिकी पिकी! आप जानते थे कि मेरा क्या मतलब है।
मार्क रैनसम

4

क्योंकि फ़्लोट्स के लिए सीमा पूर्णांकों की तुलना में अधिक होती है - एक पूर्णांक वापस करना अतिप्रवाह हो सकता है


7
तीर्थयात्रियों में अति विश्वास नहीं है; जब वे बहुत बड़े हो जाते हैं तो इसके पूर्णांक बड़े चिह्न में बदल जाते हैं। एक पायथन दुभाषिया खोलें और "2 ** 500" टाइप करें, और आप देखेंगे कि आपको एक वस्तु मिलती है जिसे आप एक इंट की तरह हर तरह से व्यवहार कर सकते हैं।
कोसची

@koschei: अनंतता का प्रतिनिधित्व करने की कोशिश करते समय बड़े निशान भी बह निकले।
स्टीफन कैनन

4

यह एक बहुत ही दिलचस्प सवाल है! फ्लोट के रूप में एक्सपोनेंट (= bits_for_exponent) को स्टोर करने के लिए कुछ बिट्स की आवश्यकता होती है जो किसी भी फ्लोटिंग पॉइंट नंबर की तुलना 2**(float_size - bits_for_exponent)में हमेशा एक अभिन्न मूल्य होगा! अन्य चरम पर एक नकारात्मक प्रतिपादक के साथ एक फ्लोट देगा 1, 0या -1। यह पूर्णांक श्रेणी बनाम फ्लोट श्रेणी मूट की चर्चा करता है क्योंकि ये फ़ंक्शन मूल संख्या को वापस कर देंगे जब भी संख्या पूर्णांक प्रकार की सीमा के बाहर होगी। अजगर फ़ंक्शन फ़ंक्शन के रैपर हैं Cऔर इसलिए यह वास्तव में उन Cफ़ंक्शन की कमी है जहां उन्हें एक पूर्णांक लौटाया जाना चाहिए और छत / फर्श पर कॉल करने से पहले प्रोग्रामर को रेंज / NaN/ Infचेक करने के लिए मजबूर करना चाहिए ।

इस प्रकार तार्किक उत्तर केवल यही समय होता है जब ये कार्य उपयोगी होते हैं वे पूर्णांक सीमा के भीतर एक मान लौटाते हैं और इसलिए यह तथ्य कि वे एक फ्लोट लौटाते हैं एक गलती है और आप इसे साकार करने के लिए बहुत स्मार्ट हैं!


1

हो सकता है क्योंकि अन्य भाषाएं भी ऐसा करती हैं, इसलिए यह आम तौर पर स्वीकृत व्यवहार है। (अच्छे कारणों के लिए, जैसा कि अन्य उत्तरों में दिखाया गया है)


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