পাইথনে // অপারেটরের সিলিং সমতুল্য কি আছে?


127

//পাইথনের অপারেটরটি সম্পর্কে আমি খুঁজে পাই যা পাইথন 3 তে মেঝেতে ভাগ হয়।

এর পরিবর্তে সিলের সাথে বিভাজনকারী কোনও অপারেটর রয়েছে কি? ( /পাইথন 3 এ অপারেটর সম্পর্কে আমি জানি যা ভাসমান পয়েন্ট বিভাগ করে))


1
গুরুত্বপূর্ণ: আপনি কোন প্রকার বা ভাসমান ফলাফল চান?
স্মি

10
আপনার ডিলিটজ-এর গৃহীত উত্তর পরিবর্তন করা উচিত। ম্যাথ.সিলটি ভাসমানদের জন্য, এটি পাইথনের স্বেচ্ছাসেবক-নির্ভুলতা দীর্ঘ অন্তর্নিহিত নিয়ে কাজ করে না।
এন্ডোলিথ

2
@ মিলিলিমুজ প্রশ্নটি বৈধ, কারণ 1) "সিল বিভাগ" "মডুলাসের সাথে বিভাগ" এর উপরও ভিত্তি করে, ২) গণিতটি আসলে কী সাধারণ এবং কোনটি নয় তা বলে না, 3) "ক্রমাগত বিনের জন্য আপনার এই অপারেশনটি প্রয়োজন প্যাকিং সমস্যা ", অর্থাত many k size আকারের কতগুলি বাক্স pack n $ আইটেমগুলি প্যাক করার জন্য প্রয়োজন।
টমাসজ গ্যান্ডার

উত্তর:


55

এমন কোনও অপারেটর নেই যা সিল দিয়ে বিভক্ত হয়। আপনার প্রয়োজন import mathএবং ব্যবহার করা উচিতmath.ceil


সুতরাং foobar = math.ceil (ফু / বার)? হুম, আমি এটি নিয়ে বেঁচে থাকতে পারি, কোথাও জানি না যে আমি এটি ব্যবহার করতে চেয়েছিলাম, কেবল কৌতূহল ছিল, ধন্যবাদ
ক্রেডাম

37
–1 ব্যবহার করবেন না , এটি খুব বড় পূর্ণসংখ্যার জন্য ব্যর্থ হতে শুরু করবে। হয় একাধিক-যথার্থ পাটিগণিত গ্রন্থাগার ব্যবহার করুন বা এই পদ্ধতির সাথে পূর্ণসংখ্যার ডোমেইনে থাকুন ।
উইম

5
অবশ্যই পূর্ণসংখ্যার ডোমেইনে থাকুন। এটি প্রায় পারফরম্যান্ট এবং মাথা ব্যাথার কম হওয়ার গ্যারান্টিযুক্ত ।
স্যামি বেঞ্চেরিফ

1
@ ডেভিড 天宇 ওয়াং জিএমপি 2 (এখানে অন্য উত্তরে উল্লিখিত) ভাল।
wim

1
মনে রাখবেন যে গণিত.সিল নির্ভুলতার 53 বিটের মধ্যে সীমাবদ্ধ। আপনি যদি বড় পূর্ণসংখ্যার সাথে কাজ করছেন তবে আপনি সঠিক ফলাফল পেতে পারেন না।
টেককুজ

290

আপনি কেবল উপরের দিকে ডাউন ফ্লোর বিভাগ করতে পারেন:

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]

2
@ পেডানা আমি সম্মতি জানাই এটি খুব স্মার্ট, তবে খুব পঠনযোগ্য এবং বজায় রাখা শক্ত নয়! আমি গণিত থেকে সিলটি আমদানির সিদ্ধান্ত নিয়েছি যাতে আমার কোনও সহকর্মী আমার কোডের লাইনটি পড়লে তিনি বুঝতে পারবেন এটি কী করে!
স্লিমচেনি

2
@ পেডানা আমি একমত নই প্রশ্নটি জিজ্ঞাসা করা হয়েছিল যে "পাইথনে" এর জন্য "একজন অপারেটর আছে"। প্রতিক্রিয়াগুলির ভিত্তিতে উত্তরটি "না" হিসাবে উপস্থিত বলে মনে হচ্ছে। যদিও আমি এর দরকারীতার জন্য ড্লিটজের জবাবটি উত্সাহিত করছি।
আনা নিম্বাস

11
@ স্লিমচেনি এই পদ্ধতিটি একটি ডকুমেন্টেড ফাংশনে টস করুন এবং আপনি যেতে ভাল। এক ঝলকানো গতিতে পারফরম্যান্স + পঠনযোগ্যতা।
স্যামি বেঞ্চিরিফ

2
@ সামিবেঞ্চিরিফ: কেবল পারফরম্যান্স + পঠনযোগ্যতা নয়, বড় ইনপুটগুলির জন্যও নির্ভুলতা; ভাসমান পয়েন্টের উপস্থাপনা সীমাবদ্ধতা রয়েছে, যখন পাইথনগুলি int(ভাল, কোনও অর্থবহ নয়; ;৪ বিট পাইথন আপনি 30 * (2**63 - 1)বিট সংখ্যায় সীমাবদ্ধ ) এবং এমনকি অস্থায়ীভাবে রূপান্তরিত করে floatতথ্য হারাতে পারে। তুলনা math.ceil((1 << 128) / 10)করার জন্য -(-(1 << 128) // 10)
শেডোএ্যাঞ্জার

1
এটি কেবল স্ট্যান্ডার্ড লাইব্রেরিতে অন্তর্ভুক্ত করা উচিত
এন্ডোলিথ

26

আপনি কাজ করতে পারে (x + (d-1)) // dযখন বিভাজক xদ্বারা d, অর্থাত্ (x + 4) // 5


2
এটি আমি ক্লাসিক পদ্ধতিটি চিরকাল ব্যবহার করেছি। যদিও নেতিবাচক বিভাজকদের জন্য কাজ করে না।
মার্ক রান্সম

এটি হিসাবে একই ফলাফল উত্পাদন করে math.ceil()
অভিজিৎ

3
@ অভিজিৎ হ্যাঁ, এটিই প্রশ্নটি জিজ্ঞাসা করে। এটি উপরের বড় পূর্ণসংখ্যার জন্য আরও ভাল কাজ sys.float_info.maxকরে এবং এর জন্য কোনও আমদানির প্রয়োজন হয় না।
আর্টিয়ার

21

সমাধান 1: অবহেলা সহ মেঝে সিলিং রূপান্তর

def ceiling_division(n, d):
    return -(n // -d)

স্মারকস্বরূপ পেন & টেলার হালকাকরণ কৌতুক , এই "বিশ্বের সক্রিয় উলটাইয়া (অস্বীকৃতি সঙ্গে), প্লেইন মেঝে বিভাজন (যেখানে সিলিং এবং মেঝে আনা হয়েছে) ব্যবহার করে, এবং তারপর বিশ্বের ডান-প্রান্ত পর্যন্ত দেখা যাচ্ছে (অস্বীকৃতি দিয়ে আবার) "

সমাধান 2: ডিভোমড () কে কাজটি করতে দিন

def ceiling_division(n, d):
    q, r = divmod(n, d)
    return q + bool(r)

Divmod () ফাংশন দেয় (a // b, a % b)পূর্ণসংখ্যার জন্য (এই বৃত্তাকার বন্ধ ত্রুটির কারণে floats সঙ্গে কম নির্ভরযোগ্য হতে পারে)। bool(r)যখনই কোনও শূন্যের অবশিষ্ট নেই সেখানে এই পদক্ষেপটি ভাগফলকে যুক্ত করে।

সমাধান 3: বিভাগের আগে অঙ্কটি সামঞ্জস্য করুন

def ceiling_division(n, d):
    return (n + d - 1) // d

অঙ্কটি উপরের দিকে অনুবাদ করুন যাতে মেঝে বিভাগটি সীমাবদ্ধ সিলিংয়ের নীচে যায় s দ্রষ্টব্য, এটি কেবল পূর্ণসংখ্যার জন্য কাজ করে।

সমাধান 4: গণিত.সিল () ব্যবহার করতে ফ্লোটে রূপান্তর করুন

def ceiling_division(n, d):
    return math.ceil(n / d)

Math.ceil () কোড বুঝতে সহজ, কিন্তু এটা ভাসে এবং ফিরে একটি ints থেকে পরিবর্তন করে। এটি খুব দ্রুত নয় এবং এর চারপাশে সমস্যা হতে পারে। এছাড়াও, এটি পাইথন 3 শব্দার্থবিজ্ঞানের উপর নির্ভর করে যেখানে "ট্রু বিভাজন" একটি ভাসমান উত্পাদন করে এবং যেখানে সিল () ফাংশনটি একটি পূর্ণসংখ্যা ফেরত দেয়।


2
দ্রুত পরীক্ষায়, # 1 এখানে তুলনায় দ্রুততম, এমনকি তুলনা করা হয় -(-a // b) ও_ও
এন্ডোলিথ

এখানে সত্যতা স্বীকার করে যে -(a // -b)দ্রুত চেয়ে -(-a // b), অন্তত যখন সময়জ্ঞান খেলনা উদাহরণpython -m timeit ...
Jasha

19

আপনি সর্বদা এটি কেবল ইনলাইনও করতে পারেন

((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

কেবলমাত্র এই পরীক্ষাগুলি আমি নিজেই চালিয়েছি আমি প্রায় 12.5 সেকেন্ড পেয়েছি, এহ্ম্ম, কেন যখন গতির এত বড় গতির পার্থক্য হয় তখন আমি গতি সম্পর্কে যত্ন নেব না?
ক্র্যাডাম

3
@ ক্র্যাডাম নোট করুন যে তিনি 100 মিলিয়ন কল ( number=100000000) ব্যবহার করছেন । প্রতি একক কল, পার্থক্য বেশ তুচ্ছ।
রাশি পঞ্চাল

4
কারণ কোড স্পষ্টতা সব ট্রাম্প। স্পষ্টতা সম্ভবত এই ক্ষেত্রে উদ্দেশ্য। তবে আপনার প্রথমে সর্বদা পঠনযোগ্য / রক্ষণাবেক্ষণযোগ্য করা উচিত। কখন এবং কেবলমাত্র যখন আপনি কোনও কার্যকারিতা চেকপয়েন্ট আবিষ্কার করেছেন, আপনি কি নিয়মগুলি ভঙ্গ করবেন। আধুনিক মেশিনগুলি এত তাড়াতাড়ি হয় এবং প্রায়শই আপনার প্রোগ্রামটি করা অন্যান্য স্টাফগুলির মধ্যে শব্দগুলি হারিয়ে যাওয়া এই ধরণের পার্থক্যকে রেন্ডার করে।
ট্র্যাভিস গ্রিগস

6
@ ট্র্যাভিসগ্রিগগুলি ভাসমান পয়েন্ট গণিতের পরিবর্তে পূর্ণসংখ্যার গণিত ব্যবহার করে কেবল গতির জন্য নয়। বড় সংখ্যার পূর্ণসংখ্যার জন্য ভাসমান গণিত ভুল উত্তর দেয়
এন্ডোলিথ

1
যদি foo = -8এবং bar = -4, উদাহরণস্বরূপ, উত্তরটি ঠিক 2 টির মতো নয়, 3 হওয়া উচিত -8 // -4। পাইথন মেঝে বিভাগটিকে "ফলাফলের সাথে প্রয়োগ করা 'ফ্লোর' ফাংশন সহ গাণিতিক বিভাগের হিসাবে সংজ্ঞায়িত করা হয়" এবং সিলিং বিভাগ একই জিনিস তবে ceil()পরিবর্তে এর সাথে হয় floor()
এন্ডোলিথ

8

মনে রাখবেন যে গণিত.সিল নির্ভুলতার 53 বিটের মধ্যে সীমাবদ্ধ। আপনি যদি বড় পূর্ণসংখ্যার সাথে কাজ করছেন তবে আপনি সঠিক ফলাফল পেতে পারেন না।

Gmpy2 libary উপলব্ধ একটিc_div ফাংশন যা সিলিং রাউন্ডইং ব্যবহার করে।

দাবি অস্বীকার: আমি gmpy2 বজায় রাখি।


3
এই প্যাকেজটি কার্যকর হবে যদি আমি ভারী গণিত বা বিজ্ঞান ভিত্তিক কিছু করে থাকি তবে আমি উত্তরটি পছন্দ করি যা মূল পাঠাগারগুলি ব্যবহার করে। এটি একটি দরকারী উত্তর হিসাবে যদিও আমি একটি
উত্সাহ

বাহ, নিশ্চিত করতে পারেন। python2 -c 'from math import ceil;assert ceil(11520000000000000102.9)==11520000000000000000'(পাশাপাশি প্রতিস্থাপনের জন্য python3) দু'টি হলেনTrue
জেমস

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.