diff options
author | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2018-09-04 13:33:02 +0000 |
---|---|---|
committer | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2018-09-04 13:33:02 +0000 |
commit | a3ed239845c428804c9bd99105f672c8ad735375 (patch) | |
tree | 83dcd1c356a5bc706b4c1d9a5a079325178b5f67 | |
parent | 7a8376e1a79b36dcdf5897d29890b14f5ae06650 (diff) | |
download | mpfr-a3ed239845c428804c9bd99105f672c8ad735375.tar.gz |
[src/sqrt_ui.c] fixed for 16-bit limb
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@13120 280ebfd0-de03-0410-8827-d642c229c3f4
-rw-r--r-- | src/sqrt_ui.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/sqrt_ui.c b/src/sqrt_ui.c index 1b2909f6b..a887720ea 100644 --- a/src/sqrt_ui.c +++ b/src/sqrt_ui.c @@ -27,6 +27,7 @@ int mpfr_sqrt_ui (mpfr_ptr r, unsigned long u, mpfr_rnd_t rnd_mode) { if (u) +#ifdef MPFR_LONG_WITHIN_LIMB { mpfr_t uu; mp_limb_t up[1]; @@ -45,6 +46,22 @@ mpfr_sqrt_ui (mpfr_ptr r, unsigned long u, mpfr_rnd_t rnd_mode) MPFR_SAVE_EXPO_FREE (expo); return mpfr_check_range(r, inex, rnd_mode); } +#else + { + mpfr_t uu; + int ret; + MPFR_SAVE_EXPO_DECL (expo); + + mpfr_init2 (uu, sizeof (unsigned long) * CHAR_BIT); + /* Warning: u might be outside the current exponent range! */ + MPFR_SAVE_EXPO_MARK (expo); + mpfr_set_ui (uu, u, MPFR_RNDZ); + MPFR_SAVE_EXPO_FREE (expo); + ret = mpfr_sqrt (r, uu, rnd_mode); + mpfr_clear (uu); + return ret; + } +#endif /* MPFR_LONG_WITHIN_LIMB */ else /* sqrt(0) = 0 */ { MPFR_SET_ZERO(r); |