2013-02-11 13 views
59

私はPythonの演算子について、Python 3ではfloorで除算を行うPythonで見つけました。Pythonに//演算子の天井相当物はありますか?

代わりにceilで除算する演算子がありますか? (私は/演算子はPython 3で浮動小数点除算を行います)

+0

「除算当時はceil」は本当に数学では一般的なものではありません。

はここでデモです。 – millimoose

+0

重要:intまたはfloatの結果が必要ですか? – smci

+3

あなたは受け入れられた答えをdlitzに変更する必要があります。 math.ceilは浮動小数点数用ですが、Pythonの任意精度のlong intでは動作しません。 – endolith

答えて

35

ceilで除算する演算子はありません。すなわち(x + 4) // 5dによってxを分割するときは、import mathに必要とmath.ceil

+0

foobar = math.ceil(foo/bar)?うーん、私はそれと一緒に暮らすことができます、私はそれを使用したいと思った、ちょうど好奇心だったのを知らない – Cradam

+8

-1 **は**を使用しないでください、これは非常に大きな整数で失敗し始めるでしょう。倍精度算術ライブラリを使用するか、[this](https://stackoverflow.com/a/17511341/674039)アプローチを使用して整数ドメインにとどまります。 – wim

9

あなたは(x + (d-1)) // d行うことができます。 python3で

+0

これは私が永遠に使用した古典的な方法です。しかし、負の除数では機能しません。 –

+0

これは 'math.ceil()'と同じ結果(https://repl.it/FZGd/5)を生成します。 – Abhijeet

+0

@Abhijeetはい、それは質問の質問です。それ以外は、 'sys.float_info.max'の上にある大きな整数ではうまく動作しますが、インポートする必要はありません。 – Artyer

8

あなたはいつも全く同じように、インライン

を行うことができます
((foo - 1) // bar) + 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 
+0

私は約12.5秒、ehrm、私はそれほど大きなスピードの違いがあるとき、私はスピードを気にしませんでしたか? – Cradam

+2

@Cradam彼は1億回の呼び出しを使用していることに注意してください( 'number = 100000000')。 1回の呼び出しにつき、その差はごくわずかです。 –

+0

ああ、ありがとう、私はceilメソッドを使用するつもりです – Cradam

7

なお、math.ceilの精度は53ビットに制限されています。大きな整数で作業している場合、正確な結果が得られないことがあります。

gmpy2 libaryは、天井丸めを使用するc_div関数を提供します。

免責事項:私はgmpy2を維持しています。

+2

このパッケージは、数学や科学を重視して何かをしていた場合に便利ですが、コアライブラリを使う答えが好きです。私はそれが有用な答えとしてupvoteを与えています – Cradam

163

あなただけ逆さまフロア分裂を行うことができます。Python's division operator does floor division(整数の除算は、小数部分を切り捨てC、とは異なり)ので

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

これは動作します。

これは、(損失の多い)浮動小数点変換がないため、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] 
+11

うわー!とても賢い!これは容認された解決策でなければなりません。 – apadana

関連する問題