//
Python 3で床で除算を行うPython の演算子について知りました。
代わりにceilで割る演算子はありますか?(/
Python 3で浮動小数点除算を行う演算子について知っています。)
//
Python 3で床で除算を行うPython の演算子について知りました。
代わりにceilで割る演算子はありますか?(/
Python 3で浮動小数点除算を行う演算子について知っています。)
回答:
ceilで割る演算子はありません。あなたがする必要がimport math
ありますmath.ceil
床を逆さまに分割するだけです。
def ceildiv(a, b):
return -(-a // b)
Pythonの除算演算子が床除算を行うため、これは機能します(整数除算が小数部分を切り捨てる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]
int
はありません(まあ、意味のあるものはありません。64ビットPythonでは、30 * (2**63 - 1)
ビット数にます)float
。一時的に変換しても、情報が失われる可能性があります。と比較math.ceil((1 << 128) / 10)
してください-(-(1 << 128) // 10)
。
つまり(x + (d-1)) // d
、で除算x
するときに行うことができます。d
(x + 4) // 5
math.ceil()
ます。
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)
は、ゼロ以外の剰余がある場合は常に商に1を加えます。
def ceiling_division(n, d):
return (n + d - 1) // d
分子を上に移動して、床の分割が意図した天井に切り捨てられるようにします。これは整数に対してのみ機能することに注意してください。
def ceiling_division(n, d):
return math.ceil(n / d)
math.ceil()のコードは、理解しやすいですが、それは山車と背中にint型に変換します。これは非常に高速ではなく、丸めの問題がある可能性があります。また、「真の除算」が浮動小数点数を生成し、ceil()関数が整数を返すPython 3のセマンティクスに依存しています。
-(-a // b)
o_O
-(a // -b)
する場合-(-a // b)
、ここよりも速いことを確認python -m timeit ...
あなたはいつもそれをインラインで行うこともできます
((foo - 1) // bar) + 1
python3では、速度を気にしていれば、float除算を強制してceil()を呼び出すよりも1桁速くなります。使用する必要があることが証明されていない限り、どちらを使用しないでください。
>>> 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
)。1回の呼び出しあたり、その差はごくわずかです。
foo = -8
とbar = -4
、例えば、答えは同じように、2、3ないでなければなりません-8 // -4
。Pythonの床除算は、「結果に「floor」関数が適用された数学的除算の除算」として定義され、天井除算は同じですが、ceil()
ではありませんfloor()
。
math.ceilは53ビットの精度に制限されていることに注意してください。大きな整数で作業している場合、正確な結果が得られない可能性があります。
gmpy2の libaryが提供c_div
天井丸めを使用する関数を。
免責事項:私はgmpy2を維持します。
python2 -c 'from math import ceil;assert ceil(11520000000000000102.9)==11520000000000000000'
(および同様にpython3
)True