Home     |     .Net Programming    |     cSharp Home    |     Sql Server Home    |     Javascript / Client Side Development     |     Ajax Programming

Ruby on Rails Development     |     Perl Programming     |     C Programming Language     |     C++ Programming     |     IT Jobs

Python Programming Language     |     Laptop Suggestions?    |     TCL Scripting     |     Fortran Programming     |     Scheme Programming Language


 
 
Cervo Technologies
The Right Source to Outsource

MS Dynamics CRM 3.0

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:

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

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:

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

Add to del.icio.us | Digg this | Stumble it | Powered by Megasolutions Inc