aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bignum.c10
-rw-r--r--numeric.c8
-rw-r--r--win32/Makefile.sub2
3 files changed, 17 insertions, 3 deletions
diff --git a/bignum.c b/bignum.c
index 99dbfc148a..8c723300f4 100644
--- a/bignum.c
+++ b/bignum.c
@@ -6765,9 +6765,15 @@ rb_big_even_p(VALUE num)
unsigned long rb_ulong_isqrt(unsigned long);
#if SIZEOF_BDIGIT*2 > SIZEOF_LONG
BDIGIT rb_bdigit_dbl_isqrt(BDIGIT_DBL);
+# ifdef ULL_TO_DOUBLE
+# define BDIGIT_DBL_TO_DOUBLE(n) ULL_TO_DOUBLE(n)
+# endif
#else
# define rb_bdigit_dbl_isqrt(x) (BDIGIT)rb_ulong_isqrt(x)
#endif
+#ifndef BDIGIT_DBL_TO_DOUBLE
+# define BDIGIT_DBL_TO_DOUBLE(n) (double)(n)
+#endif
static BDIGIT *
estimate_initial_sqrt(VALUE *xp, const size_t xn, const BDIGIT *nds, size_t len)
@@ -6789,9 +6795,9 @@ estimate_initial_sqrt(VALUE *xp, const size_t xn, const BDIGIT *nds, size_t len)
d <<= -rshift;
d |= nds[len-dbl_per_bdig-1] >> (BITSPERDIG+rshift);
}
- f = sqrt((double)d);
+ f = sqrt(BDIGIT_DBL_TO_DOUBLE(d));
d = (BDIGIT_DBL)ceil(f);
- if ((double)d == f) {
+ if (BDIGIT_DBL_TO_DOUBLE(d) == f) {
if (lowbits || (lowbits = !bary_zero_p(nds, len-dbl_per_bdig)))
++d;
}
diff --git a/numeric.c b/numeric.c
index a8b932a4c6..8c52630ce0 100644
--- a/numeric.c
+++ b/numeric.c
@@ -5140,7 +5140,7 @@ prefix##_isqrt(argtype n) \
while ((t = n/x) < (argtype)x) x = (rettype)((x + t) >> 1); \
return x; \
} \
- return (rettype)sqrt((double)n); \
+ return (rettype)sqrt(argtype##_TO_DOUBLE(n)); \
}
#if SIZEOF_LONG*CHAR_BIT > DBL_MANT_DIG
@@ -5148,6 +5148,7 @@ prefix##_isqrt(argtype n) \
#else
# define RB_ULONG_IN_DOUBLE_P(n) 1
#endif
+#define RB_ULONG_TO_DOUBLE(n) (double)(n)
#define RB_ULONG unsigned long
DEFINE_INT_SQRT(unsigned long, rb_ulong, RB_ULONG)
@@ -5157,6 +5158,11 @@ DEFINE_INT_SQRT(unsigned long, rb_ulong, RB_ULONG)
# else
# define BDIGIT_DBL_IN_DOUBLE_P(n) 1
# endif
+# ifdef ULL_TO_DOUBLE
+# define BDIGIT_DBL_TO_DOUBLE(n) ULL_TO_DOUBLE(n)
+# else
+# define BDIGIT_DBL_TO_DOUBLE(n) (double)(n)
+# endif
DEFINE_INT_SQRT(BDIGIT, rb_bdigit_dbl, BDIGIT_DBL)
#endif
diff --git a/win32/Makefile.sub b/win32/Makefile.sub
index f37b6c654b..790b41a4f1 100644
--- a/win32/Makefile.sub
+++ b/win32/Makefile.sub
@@ -550,6 +550,8 @@ $(CONFIG_H): $(MKFILES) $(srcdir)/win32/Makefile.sub $(win_srcdir)/Makefile.sub
#define HAVE_MEMORY_H 1
!if $(MSC_VER) >= 1400
#define HAVE_LONG_LONG 1
+!else
+#define ULL_TO_DOUBLE(n) ((double)(unsigned long)((n)>>32) * (1I64 << 32) + (unsigned long)(n))
!endif
#define HAVE_OFF_T 1
#define SIZEOF_INT 4