[python] 파이썬에 // 연산자와 동등한 상한선이 있습니까?

//파이썬 3에서 바닥으로 나누는 연산자에 대해 알아 냈습니다 .

대신 ceil로 나누는 연산자가 있습니까? ( /파이썬 3에서 부동 소수점 나누기를 수행 하는 연산자 에 대해 알고 있습니다.)



답변

ceil로 나누는 연산자가 없습니다. 당신은import math 하고 사용math.ceil


답변

거꾸로 바닥을 나눌 수 있습니다.

def ceildiv(a, b):
    return -(-a // b)

이것은 파이썬의 나누기 연산자가 바닥 나누기를 수행하기 때문에 작동합니다 (정수 나누기가 분수 부분을 자르는 C와 달리).

이것은 (손실이있는) 부동 소수점 변환이 없기 때문에 Python의 큰 정수에서도 작동합니다.

다음은 데모입니다.

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


답변

당신이 할 수있는 (x + (d-1)) // d나눔 경우 xd(x + 4) // 5.


답변

솔루션 1 : 부정을 사용하여 바닥을 천장으로 변환

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

Penn & Teller 부상 트릭을 연상시킵니다. 이 “세계를 거꾸로 (부정으로) 뒤집고 (천장과 바닥이 바뀐) 일반 바닥 분할을 사용한 다음, 세계를 오른쪽으로 뒤집습니다 (다시 부정으로). “

솔루션 2 : divmod ()가 작업을 수행하도록합니다.

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

divmod () 함수를 제공한다 (a // b, a % b)(이 때문에 반올림 오차 수레 안정성이 낮을 수있다)에 대해 정수. 이 단계 bool(r)는 0이 아닌 나머지가있을 때마다 몫에 1을 더합니다.

해결 방법 3 : 나누기 전에 분자 조정

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

분자를 위쪽으로 이동하여 바닥 분할이 의도 한 천장으로 내림되도록합니다. 이것은 정수에서만 작동합니다.

해결 방법 4 : math.ceil ()을 사용하기 위해 float로 변환

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

math.ceil () 코드는 이해하기 쉬운,하지만 수레와 위로의 int로 변환합니다. 이것은 매우 빠르지 않으며 반올림 문제가있을 수 있습니다. 또한 “true division”이 float를 생성하고 ceil () 함수가 정수를 반환하는 Python 3 의미 체계에 의존 합니다.


답변

항상 인라인으로 할 수 있습니다.

((foo - 1) // bar) + 1

python3에서 이것은 속도에 관심이 있다면 float 분할을 강제하고 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


답변

math.ceil은 53 비트의 정밀도로 제한됩니다. 큰 정수로 작업하는 경우 정확한 결과를 얻지 못할 수 있습니다.

gmpy2의 libary가 제공 c_div천장 라운딩을 사용 기능.

면책 조항 : gmpy2를 유지합니다.


답변

간단한 솔루션 : a // b + 1