//পাইথনের অপারেটরটি সম্পর্কে আমি খুঁজে পাই যা পাইথন 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(ভাল, কোনও অর্থবহ নয়; ;৪ বিট পাইথন আপনি 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)পূর্ণসংখ্যার জন্য (এই বৃত্তাকার বন্ধ ত্রুটির কারণে floats সঙ্গে কম নির্ভরযোগ্য হতে পারে)। bool(r)যখনই কোনও শূন্যের অবশিষ্ট নেই সেখানে এই পদক্ষেপটি ভাগফলকে যুক্ত করে।
def ceiling_division(n, d):
return (n + d - 1) // d
অঙ্কটি উপরের দিকে অনুবাদ করুন যাতে মেঝে বিভাগটি সীমাবদ্ধ সিলিংয়ের নীচে যায় s দ্রষ্টব্য, এটি কেবল পূর্ণসংখ্যার জন্য কাজ করে।
def ceiling_division(n, d):
return math.ceil(n / d)
Math.ceil () কোড বুঝতে সহজ, কিন্তু এটা ভাসে এবং ফিরে একটি ints থেকে পরিবর্তন করে। এটি খুব দ্রুত নয় এবং এর চারপাশে সমস্যা হতে পারে। এছাড়াও, এটি পাইথন 3 শব্দার্থবিজ্ঞানের উপর নির্ভর করে যেখানে "ট্রু বিভাজন" একটি ভাসমান উত্পাদন করে এবং যেখানে সিল () ফাংশনটি একটি পূর্ণসংখ্যা ফেরত দেয়।
-(-a // b) ও_ও
-(a // -b)দ্রুত চেয়ে -(-a // b), অন্তত যখন সময়জ্ঞান খেলনা উদাহরণpython -m timeit ...
আপনি সর্বদা এটি কেবল ইনলাইনও করতে পারেন
((foo - 1) // bar) + 1
পাইথন 3-তে, এটি আপনাকে তত্পরতা বিভাগকে চাপ দেওয়া এবং সিল () কল করার চেয়ে দ্রুত মাত্রার ক্রমের সাথে লাজুক, আপনি গতির যত্ন নিয়েছিলেন। যা আপনার করা উচিত নয়, যদি না আপনি প্রয়োজনীয় ব্যবহারের মাধ্যমে প্রমাণিত হন।
>>> 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()।
মনে রাখবেন যে গণিত.সিল নির্ভুলতার 53 বিটের মধ্যে সীমাবদ্ধ। আপনি যদি বড় পূর্ণসংখ্যার সাথে কাজ করছেন তবে আপনি সঠিক ফলাফল পেতে পারেন না।
Gmpy2 libary উপলব্ধ একটিc_div ফাংশন যা সিলিং রাউন্ডইং ব্যবহার করে।
দাবি অস্বীকার: আমি gmpy2 বজায় রাখি।
python2 -c 'from math import ceil;assert ceil(11520000000000000102.9)==11520000000000000000'(পাশাপাশি প্রতিস্থাপনের জন্য python3) দু'টি হলেনTrue
সহজ সমাধান: একটি // বি + 1