




Python Programming Language









Integer division
Hello all, I have two integers and I want to divide one by another, and want to get an integer result which is the higher side whenever the result is a fraction. 3/2 => 1 # Usual behavior some_func(3, 2) => 2 # Wanted Any easier solution other than int(math.ceil(float(3)/2))  Suresh
jm.sur @no.spam.gmail.com wrote: > Hello all, > I have two integers and I want to divide one by another, and want to > get an integer result which is the higher side whenever the result is > a fraction. > 3/2 => 1 # Usual behavior > some_func(3, 2) => 2 # Wanted > Any easier solution other than int(math.ceil(float(3)/2))
The normal solution is to add (divisor1) to the dividend before division. Ie ceil(3/2) = floor((3+(21))/2) = 2. Correct. But ceil(4/2) = floor((4+(21))/2) = 2 also. Correct. Hamish
On Jun 7, 2:15 pm, Hamish Moffatt <ham@cloud.net.au> wrote:
> jm.sur @no.spam.gmail.com wrote: > > Hello all, > > I have two integers and I want to divide one by another, and want to > > get an integer result which is the higher side whenever the result is > > a fraction. > > 3/2 => 1 # Usual behavior > > some_func(3, 2) => 2 # Wanted > > Any easier solution other than int(math.ceil(float(3)/2)) > The normal solution is to add (divisor1) to the dividend before division. > Ie ceil(3/2) = floor((3+(21))/2) = 2. Correct. > But ceil(4/2) = floor((4+(21))/2) = 2 also. Correct. > Hamish
What about this? >>> def div_ceil(a, b):
... if a%b: ... return ((a/b)+1) ... else: ... return (a/b) ... >>> div_ceil(3,2) 2 >>> div_ceil(3,2) 1 >>> 3%2 1 >>> (3%2) 1 >>> div_ceil(5,2) 2 >>> div_ceil(5,2)
3
jm.sur @no.spam.gmail.com <jm.sur @gmail.com> wrote: > 3/2 => 1 # Usual behavior > some_func(3, 2) => 2 # Wanted def some_func(a, b): return (a/b) And people complain about Python's behaviour regarding division of negative integers.  \S  s@chiark.greenend.org.uk  http://www.chaos.org.uk/~sion/ "Frankly I have no feelings towards penguins one way or the other"  Arthur C. Clarke her nu become se bera eadward ofdun hlddre heafdes bce bump bump bump
jm.sur @no.spam.gmail.com wrote: > On Jun 7, 2:15 pm, Hamish Moffatt <ham @cloud.net.au> wrote: >> jm.sur @no.spam.gmail.com wrote: >>> Hello all, >>> I have two integers and I want to divide one by another, and want to >>> get an integer result which is the higher side whenever the result is >>> a fraction. >>> 3/2 => 1 # Usual behavior >>> some_func(3, 2) => 2 # Wanted >>> Any easier solution other than int(math.ceil(float(3)/2)) >> The normal solution is to add (divisor1) to the dividend before division. >> Ie ceil(3/2) = floor((3+(21))/2) = 2. Correct. >> But ceil(4/2) = floor((4+(21))/2) = 2 also. Correct. > What about this? >>>> def div_ceil(a, b): > ... if a%b: > ... return ((a/b)+1) > ... else: > ... return (a/b)
Yes, although it's not as short or as fast (probably as my version): def div_ceil(a, b): return ((a+(b1))/b) Hamish
Hamish Moffatt <ham@cloud.net.au> wrote: >jm.sur @no.spam.gmail.com wrote: >>>>> def div_ceil(a, b): >> ... if a%b: >> ... return ((a/b)+1) >> ... else: >> ... return (a/b) >Yes, although it's not as short or as fast (probably as my version): >def div_ceil(a, b): > return ((a+(b1))/b)
If that's what you care about: $ python mtimeit s 'def divc1(a,b): return (a+b1)/b' 'divc1(3,2)' 1000000 loops, best of 3: 0.443 usec per loop $ python mtimeit s 'def divc2(a,b): return (a/b)' 'divc2(3,2)' 1000000 loops, best of 3: 0.331 usec per loop Also, note: >>> divc2(sys.maxint, 2) 1073741824 >>> divc1(sys.maxint, 2)
1073741824L which is going to cause problems with sys.version_info < (2, 3) . (Or do I mean (2, 2)? I don't have a 2.2 to hand.)  \S  s@chiark.greenend.org.uk  http://www.chaos.org.uk/~sion/ "Frankly I have no feelings towards penguins one way or the other"  Arthur C. Clarke her nu become se bera eadward ofdun hlddre heafdes bce bump bump bump
"Sion Arrowsmith" <s @chiark.greenend.org.uk> wrote in message news:Y9z*GPFMr@news.chiark.greenend.org.uk...  jm.sur @no.spam.gmail.com <jm.sur @gmail.com> wrote:  > 3/2 => 1 # Usual behavior  > some_func(3, 2) => 2 # Wanted   def some_func(a, b):  return (a/b)   And people complain about Python's behaviour regarding division of  negative integers. Nice. This goes on my 'why didn't I think of that' list;) I was thinking of the rather pedestrian d,r = divmod(a,b) if r: d+=1 tjr
jm.sur @no.spam.gmail.com wrote: > Hello all, > I have two integers and I want to divide one by another, and want to > get an integer result which is the higher side whenever the result is > a fraction. > 3/2 => 1 # Usual behavior > some_func(3, 2) => 2 # Wanted Are you trying to accomplish int((a/b) + 0.5), but cheaply? If so, consider that that is the same as (a/b) + (b/2b), which is (2a/2b) + (b/2b), which is (2a+b)/2b. Since this just involves doubling you can avoid multiplying altogether and just use this: def rounddiv(a,b): return int((a+a+b)/(b+b)) That's 3 integer adds and 1 integer divide. The int() cast is just there is case somebody passes in floats for a or b; if you know you're only going to have integer arguments you don't need it.
On Jun 7, 8:30 pm, Some Other Guy <bga@microsoft.com> wrote:
> jm.sur @no.spam.gmail.com wrote: > > Hello all, > > I have two integers and I want to divide one by another, and want to > > get an integer result which is the higher side whenever the result is > > a fraction. > > 3/2 => 1 # Usual behavior > > some_func(3, 2) => 2 # Wanted > Are you trying to accomplish int((a/b) + 0.5), but cheaply? > If so, consider that that is the same as (a/b) + (b/2b), > which is (2a/2b) + (b/2b), which is (2a+b)/2b. > Since this just involves doubling you can avoid multiplying altogether > and just use this: > def rounddiv(a,b): > return int((a+a+b)/(b+b)) > That's 3 integer adds and 1 integer divide. The int() cast is just > there is case somebody passes in floats for a or b; if you know you're > only going to have integer arguments you don't need it.
The // operator was added to the language for a reason. I'm surprised at how few Pythonistas are using it six years later.
"Some Other Guy" <bga@microsoft.com> wrote in message news:bb9ae$4668b133$cef88832$11811@TEKSAVVY.COM...  jm.sur @no.spam.gmail.com wrote:   > Hello all,  > I have two integers and I want to divide one by another, and want to  > get an integer result which is the higher side whenever the result is  > a fraction.  > 3/2 => 1 # Usual behavior  > some_func(3, 2) => 2 # Wanted   Are you trying to accomplish int((a/b) + 0.5), but cheaply? No, the OP wanted 'ceiling' division rather than 'floor' division. In other words, always round up instead of down.  If so, consider that that is the same as (a/b) + (b/2b),  which is (2a/2b) + (b/2b), which is (2a+b)/2b. This is nice for rounded division. tjr
In <1181275686.205607.53@q69g2000hsb.googlegroups.com>, Dan Bishop wrote: > On Jun 7, 8:30 pm, Some Other Guy <bga @microsoft.com> wrote: >> Since this just involves doubling you can avoid multiplying altogether >> and just use this: >> def rounddiv(a,b): >> return int((a+a+b)/(b+b)) >> That's 3 integer adds and 1 integer divide. The int() cast is just >> there is case somebody passes in floats for a or b; if you know you're >> only going to have integer arguments you don't need it. > The // operator was added to the language for a reason. I'm surprised > at how few Pythonistas are using it six years later.
It would just document intent here because it still gives `float` results if used with at least one `float` as operands: In [1]: 10.0 // 2 Out[1]: 5.0 Ciao, Marc 'BlackJack' Rintsch





