|
|
 |
 |
 |
 |
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 (divisor-1) to the dividend before division. Ie ceil(3/2) = floor((3+(2-1))/2) = 2. Correct. But ceil(4/2) = floor((4+(2-1))/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 (divisor-1) to the dividend before division. > Ie ceil(3/2) = floor((3+(2-1))/2) = 2. Correct. > But ceil(4/2) = floor((4+(2-1))/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 (divisor-1) to the dividend before division. >> Ie ceil(3/2) = floor((3+(2-1))/2) = 2. Correct. >> But ceil(4/2) = floor((4+(2-1))/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+(b-1))/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+(b-1))/b)
If that's what you care about: $ python -mtimeit -s 'def divc1(a,b): return (a+b-1)/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
|
 |
 |
 |
 |
|