summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--generic/tclExecute.c20
-rw-r--r--generic/tclTomMathInterface.c6
-rw-r--r--libtommath/bn_mp_set_double.c4
-rw-r--r--libtommath/bn_mp_sqrt.c22
4 files changed, 27 insertions, 25 deletions
diff --git a/generic/tclExecute.c b/generic/tclExecute.c
index 4c36123..a4a4646 100644
--- a/generic/tclExecute.c
+++ b/generic/tclExecute.c
@@ -6032,7 +6032,7 @@ TEBCresume(
/* [string is integer] is -UINT_MAX to UINT_MAX range */
int i;
- if (Tcl_GetIntFromObj(NULL, OBJ_AT_TOS, &i) != TCL_OK) {
+ if (TclGetIntFromObj(NULL, OBJ_AT_TOS, &i) != TCL_OK) {
type1 = TCL_NUMBER_WIDE;
}
#ifndef TCL_WIDE_INT_IS_LONG
@@ -6040,7 +6040,7 @@ TEBCresume(
/* value is between WIDE_MIN and WIDE_MAX */
/* [string is wideinteger] is -UWIDE_MAX to UWIDE_MAX range */
int i;
- if (Tcl_GetIntFromObj(NULL, OBJ_AT_TOS, &i) == TCL_OK) {
+ if (TclGetIntFromObj(NULL, OBJ_AT_TOS, &i) == TCL_OK) {
type1 = TCL_NUMBER_LONG;
}
#endif
@@ -6049,7 +6049,7 @@ TEBCresume(
/* [string is wideinteger] is -UWIDE_MAX to UWIDE_MAX range */
Tcl_WideInt w;
- if (Tcl_GetWideIntFromObj(NULL, OBJ_AT_TOS, &w) == TCL_OK) {
+ if (TclGetWideIntFromObj(NULL, OBJ_AT_TOS, &w) == TCL_OK) {
type1 = TCL_NUMBER_WIDE;
}
}
@@ -8984,22 +8984,18 @@ ExecuteExtendedBinaryMathOp(
#endif
overflowExpon:
- Tcl_TakeBignumFromObj(NULL, value2Ptr, &big2);
- if ((big2.used > 1)
-#if DIGIT_BIT > 28
- || ((big2.used == 1) && (big2.dp[0] >= (1<<28)))
-#endif
- ) {
- mp_clear(&big2);
+
+ if ((TclGetWideIntFromObj(NULL, value2Ptr, &w2) != TCL_OK)
+ || (value2Ptr->typePtr != &tclIntType)
+ || (Tcl_WideUInt)w2 >= (1<<28)) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"exponent too large", -1));
return GENERAL_ARITHMETIC_ERROR;
}
Tcl_TakeBignumFromObj(NULL, valuePtr, &big1);
mp_init(&bigResult);
- mp_expt_d(&big1, big2.dp[0], &bigResult);
+ mp_expt_d(&big1, w2, &bigResult);
mp_clear(&big1);
- mp_clear(&big2);
BIG_RESULT(&bigResult);
}
diff --git a/generic/tclTomMathInterface.c b/generic/tclTomMathInterface.c
index d7da4ee..902fd8d 100644
--- a/generic/tclTomMathInterface.c
+++ b/generic/tclTomMathInterface.c
@@ -119,8 +119,7 @@ TclBNInitBignumFromLong(
* Allocate enough memory to hold the largest possible long
*/
- status = mp_init_size(a,
- (CHAR_BIT * sizeof(long) + DIGIT_BIT - 1) / DIGIT_BIT);
+ status = mp_init(a);
if (status != MP_OKAY) {
Tcl_Panic("initialization failure in TclBNInitBignumFromLong");
}
@@ -206,8 +205,7 @@ TclBNInitBignumFromWideUInt(
* Allocate enough memory to hold the largest possible Tcl_WideUInt.
*/
- status = mp_init_size(a,
- (CHAR_BIT * sizeof(Tcl_WideUInt) + DIGIT_BIT - 1) / DIGIT_BIT);
+ status = mp_init(a);
if (status != MP_OKAY) {
Tcl_Panic("initialization failure in TclBNInitBignumFromWideUInt");
}
diff --git a/libtommath/bn_mp_set_double.c b/libtommath/bn_mp_set_double.c
index c96a3b3..12f8dad 100644
--- a/libtommath/bn_mp_set_double.c
+++ b/libtommath/bn_mp_set_double.c
@@ -15,11 +15,11 @@
#if defined(__STDC_IEC_559__) || defined(__GCC_IEC_559)
int mp_set_double(mp_int *a, double b)
{
- uint64_t frac;
+ unsigned long long frac;
int exp, res;
union {
double dbl;
- uint64_t bits;
+ unsigned long long bits;
} cast;
cast.dbl = b;
diff --git a/libtommath/bn_mp_sqrt.c b/libtommath/bn_mp_sqrt.c
index bbca158..116fb14 100644
--- a/libtommath/bn_mp_sqrt.c
+++ b/libtommath/bn_mp_sqrt.c
@@ -14,6 +14,9 @@
#ifndef NO_FLOATING_POINT
#include <math.h>
+#if (DIGIT_BIT != 28) || (FLT_RADIX != 2) || (DBL_MANT_DIG != 53) || (DBL_MAX_EXP != 1024)
+#define NO_FLOATING_POINT
+#endif
#endif
/* this function is less generic than mp_n_root, simpler and faster */
@@ -21,8 +24,8 @@ int mp_sqrt(const mp_int *arg, mp_int *ret)
{
int res;
mp_int t1, t2;
- int i, j, k;
#ifndef NO_FLOATING_POINT
+ int i, j, k;
volatile double d;
mp_digit dig;
#endif
@@ -38,6 +41,8 @@ int mp_sqrt(const mp_int *arg, mp_int *ret)
return MP_OKAY;
}
+#ifndef NO_FLOATING_POINT
+
i = (arg->used / 2) - 1;
j = 2 * i;
if ((res = mp_init_size(&t1, i+2)) != MP_OKAY) {
@@ -52,8 +57,6 @@ int mp_sqrt(const mp_int *arg, mp_int *ret)
t1.dp[k] = (mp_digit) 0;
}
-#ifndef NO_FLOATING_POINT
-
/* Estimate the square root using the hardware floating point unit. */
d = 0.0;
@@ -96,11 +99,16 @@ int mp_sqrt(const mp_int *arg, mp_int *ret)
#else
- /* Estimate the square root as having 1 in the most significant place. */
+ if ((res = mp_init_copy(&t1, arg)) != MP_OKAY) {
+ return res;
+ }
+
+ if ((res = mp_init(&t2)) != MP_OKAY) {
+ goto E2;
+ }
- t1.used = i + 2;
- t1.dp[i+1] = (mp_digit) 1;
- t1.dp[i] = (mp_digit) 0;
+ /* First approx. (not very bad for large arg) */
+ mp_rshd(&t1, t1.used/2);
#endif