Il 2020-04-19 10:44 ni...@lysator.liu.se ha scritto:
Marco Bodrato <bodr...@mail.dm.unipi.it> writes:
+int
+mpz_fits_sint_p (const mpz_t u)
+{
+ return (INT_MAX + INT_MIN == 0 || mpz_cmp_ui (u, INT_MAX) <= 0) &&
+ mpz_cmpabs_ui (u, GMP_NEG_CAST (unsigned long int, INT_MIN)) <=
0;
+}
I think this and mpz_fits_sshort_p would be simpler using mpz_cmp_si,
int
mpz_fits_sint_p (const mpz_t u)
{
return mpz_cmp_si (u, INT_MAX) <= 0 && mpz_cmp_si (i, INT_MIN) >= 0;
}
The current implementation of _cmp_si in mini- is:
mpz_cmp_si (const mpz_t u, long v)
{
mp_size_t usize = u->_mp_size;
if (v >= 0)
return mpz_cmp_ui (u, v);
else if (usize >= 0)
return 1;
else
return - mpz_cmpabs_ui (u, GMP_NEG_CAST (unsigned long int, v));
}
So that the compiler may optimise your code to:
return mpz_cmp_ui (u, INT_MAX) <= 0 &&
(u->_mp_size >= 0 ||
mpz_cmpabs_ui (u, GMP_NEG_CAST (unsigned long int, INT_MIN)) <=
0) ;
which basically is the condition I wrote, with one more branch.
BTW, do we have any C implementation where INT_MAX + INT_MIN == 0,
i.e.,
not using two's complement?
I'm almost sure the compiler can optimise that out at compile time.
Ĝis,
m
_______________________________________________
gmp-devel mailing list
gmp-devel@gmplib.org
https://gmplib.org/mailman/listinfo/gmp-devel