--- data.c.~1.308.~ 2009-12-05 08:07:48.000000000 +0100 +++ data.c 2009-12-05 13:27:33.000000000 +0100 @@ -2393,23 +2393,26 @@ p++; if (isfloat_string (p, 1) && b == 10) - val = make_float (sign * atof (p)); - else - { - double v = 0; - - while (1) - { - int digit = digit_to_number (*p++, b); - if (digit < 0) - break; - v = v * b + digit; - } - - val = make_fixnum_or_float (sign * v); - } - - return val; + return make_float (sign * atof (p)); + else { + unsigned long u = 0; + while (1) + { + int digit = digit_to_number (*p++, b); + if (digit < 0) + return make_number (sign * u); + else if (u <= (MOST_POSITIVE_FIXNUM - digit) / b) + u = u * b + digit; + else + { + /* overflow to flonums */ + double f = ((double)u) * b + digit; + while (digit = digit_to_number (*p++, b), digit >= 0) + f = f * b + digit; + return make_float (sign * f); + } + } + } }