मुझे //
पायथन में ऑपरेटर के बारे में पता चला जो कि पायथन 3 में फर्श के साथ विभाजन करता है।
क्या कोई ऑपरेटर है जो इसके बजाय छत के साथ विभाजित करता है? (मैं उस /
ऑपरेटर के बारे में जानता हूं जो पायथन 3 फ्लोटिंग पॉइंट डिवीजन करता है।)
मुझे //
पायथन में ऑपरेटर के बारे में पता चला जो कि पायथन 3 में फर्श के साथ विभाजन करता है।
क्या कोई ऑपरेटर है जो इसके बजाय छत के साथ विभाजित करता है? (मैं उस /
ऑपरेटर के बारे में जानता हूं जो पायथन 3 फ्लोटिंग पॉइंट डिवीजन करता है।)
जवाबों:
कोई भी ऑपरेटर नहीं है जो छत के साथ विभाजित करता है। आपको import math
उपयोग करने की आवश्यकता हैmath.ceil
आप बस उल्टा फर्श विभाजन कर सकते हैं:
def ceildiv(a, b):
return -(-a // b)
यह काम करता है क्योंकि पायथन का डिवीजन ऑपरेटर फ्लोर डिवीजन करता है (सी के विपरीत, जहां पूर्णांक विभाजन आंशिक भाग को काटता है)।
यह पायथन के बड़े पूर्णांकों के साथ भी काम करता है, क्योंकि फ्लोटिंग-पॉइंट रूपांतरण नहीं है।
यहाँ एक प्रदर्शन है:
>>> from __future__ import division # a/b is float division
>>> from math import ceil
>>> b = 3
>>> for a in range(-7, 8):
... print(["%d/%d" % (a, b), int(ceil(a / b)), -(-a // b)])
...
['-7/3', -2, -2]
['-6/3', -2, -2]
['-5/3', -1, -1]
['-4/3', -1, -1]
['-3/3', -1, -1]
['-2/3', 0, 0]
['-1/3', 0, 0]
['0/3', 0, 0]
['1/3', 1, 1]
['2/3', 1, 1]
['3/3', 1, 1]
['4/3', 2, 2]
['5/3', 2, 2]
['6/3', 2, 2]
['7/3', 3, 3]
int
(अच्छी तरह से, कोई सार्थक नहीं हैं; 64 बिट पायथन पर आप 30 * (2**63 - 1)
बिट संख्या तक सीमित हैं ), और यहां तक कि अस्थायी रूप से परिवर्तित करने float
से जानकारी खो सकती है। से तुलना math.ceil((1 << 128) / 10)
करें -(-(1 << 128) // 10)
।
तुम कर सकते हो (x + (d-1)) // d
जब विभाजित x
द्वारा d
, यानी (x + 4) // 5
।
sys.float_info.max
, और इसके लिए आयात की आवश्यकता नहीं होती है।
def ceiling_division(n, d):
return -(n // -d)
पेन एंड टेलर लेविटेशन ट्रिक की याद दिलाता है , यह "दुनिया को उल्टा कर देता है (नकारात्मकता के साथ), सादे फर्श विभाजन (जहां छत और फर्श की अदला-बदली हुई है) का उपयोग करता है, और फिर दुनिया को राइट-साइड अप (फिर से नकारात्मकता) के साथ बदल देता है "
def ceiling_division(n, d):
q, r = divmod(n, d)
return q + bool(r)
Divmod () समारोह देता (a // b, a % b)
पूर्णांकों के लिए (इस दौर बंद त्रुटि के कारण तैरता साथ कम विश्वसनीय हो सकती)। bool(r)
जब भी कोई शून्य शून्य शेष रहता है, तो चरण एक को भागफल में जोड़ता है।
def ceiling_division(n, d):
return (n + d - 1) // d
अंश का ऊपर की ओर अनुवाद करें ताकि मंजिल विभाजन गोल छत के नीचे आ जाए। ध्यान दें, यह केवल पूर्णांकों के लिए काम करता है।
def ceiling_division(n, d):
return math.ceil(n / d)
Math.ceil () कोड समझने में आसान है, लेकिन यह तैरता और वापस करने के लिए ints से बदल देता है। यह बहुत तेज़ नहीं है और इसमें समस्याएँ हो सकती हैं। इसके अलावा, यह पायथन 3 शब्दार्थ पर निर्भर करता है जहां "सच्चा विभाजन" एक फ्लोट का उत्पादन करता है और जहां छत () फ़ंक्शन एक पूर्णांक देता है।
-(-a // b)
o_O
-(a // -b)
है -(-a // b)
, जब खिलौना उदाहरण मिलता हैpython -m timeit ...
आप हमेशा इसे केवल इनलाइन भी कर सकते हैं
((foo - 1) // bar) + 1
Python3 में, यह फ्लोट डिवीजन को मजबूर करने और सीलिंग () को कॉल करने की तुलना में तेज़ी के एक आदेश से शर्मीली है, बशर्ते आपको गति के बारे में परवाह हो। जब तक आपको उस उपयोग के माध्यम से साबित नहीं करना चाहिए, जिसकी आपको आवश्यकता है।
>>> timeit.timeit("((5 - 1) // 4) + 1", number = 100000000)
1.7249219375662506
>>> timeit.timeit("ceil(5/4)", setup="from math import ceil", number = 100000000)
12.096064013894647
number=100000000
) कर रहा है। एकल कॉल के अनुसार, अंतर बहुत ही महत्वहीन है।
foo = -8
और bar = -4
, उदाहरण के लिए, इस सवाल का जवाब 2, नहीं 3, बस की तरह होना चाहिए -8 // -4
। पायथन फ्लोर डिवीजन को " फर्श के गणितीय गणित के रूप में परिभाषित किया गया है, जिसके परिणाम में 'फ्लोर' फ़ंक्शन लागू होता है" और सीलिंग डिवीजन एक ही बात है, लेकिन ceil()
इसके बजाय floor()
।
ध्यान दें कि math.ceil परिशुद्धता के 53 बिट्स तक सीमित है। यदि आप बड़े पूर्णांक के साथ काम कर रहे हैं, तो आपको सटीक परिणाम नहीं मिल सकते हैं।
Gmpy2 पुस्तकालय प्रदान करता है एकc_div
समारोह जो छत राउंडिंग उपयोग करता है।
अस्वीकरण: मैं gmpy2 बनाए रखता हूं।
python2 -c 'from math import ceil;assert ceil(11520000000000000102.9)==11520000000000000000'
(साथ ही प्रतिस्थापित python3
) BOTH हैंTrue
सरल समाधान: ए / बी + 1