summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2018-09-04 13:33:02 +0000
committerzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2018-09-04 13:33:02 +0000
commita3ed239845c428804c9bd99105f672c8ad735375 (patch)
tree83dcd1c356a5bc706b4c1d9a5a079325178b5f67
parent7a8376e1a79b36dcdf5897d29890b14f5ae06650 (diff)
downloadmpfr-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.c17
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);