ฉันพบข้อมูลเกี่ยวกับตัว//
ดำเนินการใน Python ซึ่งใน Python 3 ทำการหารด้วยพื้น
มีตัวดำเนินการที่หารด้วย ceil แทนหรือไม่? (ฉันรู้เกี่ยวกับตัว/
ดำเนินการซึ่งใน Python 3 ทำการหารทศนิยม)
ฉันพบข้อมูลเกี่ยวกับตัว//
ดำเนินการใน Python ซึ่งใน Python 3 ทำการหารด้วยพื้น
มีตัวดำเนินการที่หารด้วย ceil แทนหรือไม่? (ฉันรู้เกี่ยวกับตัว/
ดำเนินการซึ่งใน Python 3 ทำการหารทศนิยม)
คำตอบ:
ไม่มีตัวดำเนินการที่หารด้วย ceil คุณจำเป็นต้องimport math
ใช้math.ceil
คุณสามารถแบ่งพื้นแบบกลับหัวได้:
def ceildiv(a, b):
return -(-a // b)
สิ่งนี้ได้ผลเนื่องจากตัวดำเนินการหารของ Python ทำการแบ่งพื้น (ไม่เหมือนใน C ซึ่งการหารจำนวนเต็มจะตัดทอนส่วนที่เป็นเศษส่วน)
นอกจากนี้ยังใช้ได้กับจำนวนเต็มขนาดใหญ่ของ Python เนื่องจากไม่มีการแปลงทศนิยม (lossy)
นี่คือการสาธิต:
>>> 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
ไม่ได้ (เช่นกันไม่มีความหมายใน Python 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 เป็น float และ back ไม่เร็วมากและอาจมีปัญหาในการปัดเศษ นอกจากนี้ยังอาศัยความหมายของ Python 3 โดยที่ "การหารจริง" จะสร้างค่าลอยและโดยที่ฟังก์ชันceil ()ส่งกลับจำนวนเต็ม
-(-a // b)
o_O
-(a // -b)
เร็วกว่า-(-a // b)
อย่างน้อยที่สุดเมื่อจับเวลาตัวอย่างของเล่นด้วยpython -m timeit ...
คุณสามารถทำแบบอินไลน์ได้ตลอดเวลาเช่นกัน
((foo - 1) // bar) + 1
ใน python3 นี่เป็นเพียงแค่ลำดับความสำคัญที่เร็วกว่าการบังคับให้ส่วนลอยและเรียก ceil () หากคุณสนใจเรื่องความเร็ว สิ่งที่คุณไม่ควรทำเว้นแต่คุณจะได้พิสูจน์ผ่านการใช้งานที่คุณต้องการ
>>> 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
) ทั้งสองคือTrue