diff --git a/opt/bignum.c b/opt/bignum.c
index d80fb6cb..b1b82780 100644
--- a/opt/bignum.c
+++ b/opt/bignum.c
@@ -139,8 +139,9 @@ sexp sexp_bignum_normalize (sexp a) {
 
 double sexp_bignum_to_double (sexp a) {
   double res = 0;
-  sexp_uint_t i, *data=sexp_bignum_data(a);
-  for (i=0; i<sexp_bignum_length(a); i++)
+  sexp_sint_t i;
+  sexp_uint_t *data=sexp_bignum_data(a);
+  for (i=sexp_bignum_hi(a); i>=0; i--)
     res = res * ((double)SEXP_UINT_T_MAX+1) + data[i];
   return res;
 }