mpz_limbs interface

Niels Möller nisse at lysator.liu.se
Tue Jan 21 20:16:35 UTC 2014


Marc Glisse <marc.glisse at inria.fr> writes:

> On Tue, 21 Jan 2014, Niels Möller wrote:
>
>> When does this situation arise?
>
> __GMPXX_TMPZ_D, for instance.

>From a quick look in gmpxx.h, it appears we could *almost* use
MPZ_ROINIT_N. For the target call, the temp variable always used as an mpz_t
*input* only (from a quick look at gmpxx.h). But the initialization
calls mpz_set_d. Ideal would be something like

  mp_limb_t limbs[__GMPZ_DBL_LIMBS];
  mpz_t temp = MPZ_ROINIT_N(limbs, mpn_set_d(limbs, d));

This assumes that C++ allows initializers with arbitrary non-constant
expressions (does it?), and that we implement mpn_set_d. Then, mpz_set_d
could be reimplemented as

  void 
  mpz_set_d (mpz_t r, double d)
  {
    rn = ... needed space for d ...
    mp_ptr rp = MPZ_REALLOC (r, rn);
    SIZ(r) = mpn_set_d (rp, d));
  }

In the current code, there's a related function __gmp_extract_double. I
haven't really tried to understant how mpz_set_d works.

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-devel mailing list