mpz_{eq,lt,gt}_{ui,si}_p macros?

Marc Glisse marc.glisse at
Mon Feb 11 00:42:06 CET 2013

On Sun, 10 Feb 2013, bodrato at wrote:

> I played with gmpxx.h for a while, because Torbjorn said something about
> possible functions for comparison with shortcuts to detect specific
> conditions (>, =, or <)...
> After some tests with C++ I moved my experiments to plain C.
> The current status of the experiments is shown by the attached patch. The
> proposal is: let's introduce new macros like mpz_lt_ui_p, with default

Could we have inline functions instead of macros? I'd rather avoid macros 
if they aren't necessary.

> definition like the following:
> #define mpz_lt_ui_p(Z,UI) (_mpz_cmp_ui (Z,UI) < 0)
> but possibly handling special cases with faster code...
> Do you think it can make sense?

I am wondering (true question) how much this gains compared to refining 
the existing mpz_cmp_[su]i macros.

> The attached patch is able to sensibly speed-up the execution of the
> simple C++ loop I'm testing:
> #include "gmpxx.h"
> #define BIGN 123456789
> #define BIGS 987654321
> int main (void)
> {
>  mpz_class z(BIGN);
>  unsigned r = 0;
>  for (z*=BIGS; z>r; z-=BIGS)
>    ++r;
>  printf ("%u",r);
> }
> If you like the idea, then please read carefully the lt_si and gt_si
> variants, I'm not sure I'm handling correctly the negative constants.

-(SI) seems wrong, you need to cast to an unsigned type before taking the 
opposite, or LONG_MIN gives you undefined behavior.

Marc Glisse

More information about the gmp-devel mailing list