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.
More information about the gmp-bugs
mailing list