From ccc0b034ed6755f5dee1382fd27910d5c44d627d Mon Sep 17 00:00:00 2001 From: Fredrik Johansson Date: Wed, 11 Apr 2012 10:36:09 +0200 Subject: [PATCH] add utility function --- ufloat.h | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/ufloat.h b/ufloat.h index 97c0b243..44c8c911 100644 --- a/ufloat.h +++ b/ufloat.h @@ -261,6 +261,39 @@ ufloat_get_fmpz(fmpz_t z, const ufloat_t u) } } +static __inline__ void +ufloat_set_mpfr(ufloat_t u, const mpfr_t x) +{ + if (mpfr_zero_p(x)) + { + u->man = 0; + u->exp = 0; + } + else + { + mpz_t t; + long exp, bits; + + mpz_init(t); + exp = mpfr_get_z_2exp(t, x); + mpz_abs(t, t); + + bits = mpz_sizeinbase(t, 2); + + if (bits > UFLOAT_PREC) + { + mpz_cdiv_q_2exp(t, t, bits - UFLOAT_PREC); + exp += bits - UFLOAT_PREC; + } + + u->exp = exp; + u->man = mpz_get_ui(t); + ufloat_normalise(u); + + mpz_clear(t); + } +} + void ufloat_log(ufloat_t z, const ufloat_t x); void ufloat_log1p(ufloat_t z, const ufloat_t x);