tests/mpq/t-get_d.c failure on m68k-linux

Niels Möller nisse at lysator.liu.se
Mon Feb 18 21:43:30 CET 2013

Aldy Hernandez <aldyh at redhat.com> writes:

> The problematic code in the test was:
>     d = my_ldexp (d, (int) (rp[LIMBS_PER_DOUBLE] % 1000) - 500);
>     __gmpq_set_d (q, d);
>     nd = __gmpz_get_d ((&((q)->_mp_num)));
>     dd = __gmpz_get_d ((&((q)->_mp_den)));
>     d2 = nd / dd;
>     if (d != d2)		<-- boo hiss!
>         return -1;

Maybe I'm naive, but does it help to simple change

  double d, d2, nd, dd;

at the top of that function to

  volatile double d, d2, nd, dd;

I mean, it shouldn't make much difference if excess precision is
discarded before or after it is passed as a return value from my_ldexp,
should it?

On the other hand, maybe the test ought to be rewritten. Using mpz_get_d
seems unnecessary. If I understand the code correctly, it constructs a
fraction a / 2^k which surely is representable as a double, and assigns
it to the double d using ldexp, and then assigns it to an mpq_t using

Then it would make more sense to me to get back *integer* numerator and
denominator, say n / d, and then check that a * d = n*2^k.


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