mpz_div_2exp function

Niels Möller nisse at lysator.liu.se
Mon Jun 24 21:24:44 CEST 2013

```leif <not.really at online.de> writes:

> FWIW, in 5.1.1 there's
>
> /usr/include/gmp.h:#define mpz_div_2exp	mpz_fdiv_q_2exp

Ah, there it is. And fdiv means floor, i.e, rounding towards -infinity,
*not* towards zero. It works as an arithmetic right shift, if one thinks
about negative numbers as using two's complement representation.

So, e.g, -5 (decimal) divided by 2 gives -3. In signed-magnitude binary,
that's

-101 >> 1 == -11

which might look strange. But in two's complement (with infinitely many
ones to the left), it's

...11111011 >> 1 == ...11111101

which is a plain arithmetic right shift.

BTW, using >> in C for signed numbers is implementation defined, IIRC,
but at least on my platform it seems to be compiled to an arithmetic
right shift, i.e., rounding towards -infinity. Unlike the division
operator, which rounds towards zero. The following test program,

#include <stdio.h>

int
main (int argc, char **argv)
{
int x = -5;
printf ("%d >> 1 == %d\n", x, x >> 1);
printf ("%d / 2 == %d\n", x, x / 2);
return 0;
}

prints

-5 >> 1 == -3
-5 / 2 == -2

Not sure if this makes the GMP behaviour more or less confusing...

Regards,
/Niels

--
Niels Möller. PGP-encrypted email is preferred. Keyid C0B98E26.
Internet email is subject to wholesale government surveillance.
```