Marc, > If the function mpz_get_ld is provided, I expect it to work for the whole > (exponent) range of long double value, not just the range of double. > Should we first do something about large z, then apply your method and fix > the result with ldexpl?
you are right. Here is an improved version. long double mpz_get_ld (mpz_t z) { long double h, l; long int e; mpz_t tmp; h = (long double) mpz_get_d_2exp (&e, z); /* 0.5 <= |h| < 1 */ h = ldexpl (h, 53); /* now h is an integer */ e -= 53; mpz_init (tmp); mpz_set_d (tmp, (double) h); /* exact */ if (e >= 0) mpz_mul_2exp (tmp, tmp, e); else mpz_div_2exp (tmp, tmp, -e); mpz_sub (tmp, z, tmp); h = ldexpl (h, e); l = (long double) mpz_get_d_2exp (&e, tmp); l = ldexpl (l, e); mpz_clear (tmp); return h + l; } Paul _______________________________________________ gmp-devel mailing list gmp-devel@gmplib.org http://gmplib.org/mailman/listinfo/gmp-devel