[Win32] set_str() ignores exponent iff base > 36
Sisyphus
sisyphus1 at optusnet.com.au
Mon Dec 10 07:41:34 CET 2007
----- Original Message -----
From: "Torbjorn Granlund" <tg at swox.com>
To: "Sisyphus" <sisyphus1 at optusnet.com.au>; <gmp-bugs at swox.com>
Sent: Monday, December 10, 2007 3:51 PM
Subject: Re: [Win32] set_str() ignores exponent iff base > 36
> Please try this patch instead.
>
> *** mpf/set_str.c 30 Aug 2007 18:19:41 -0000
> --- mpf/set_str.c 10 Dec 2007 04:47:18 -0000
> *************** mpf_set_str (mpf_ptr x, const char *str,
> *** 272,277 ****
>
> if (expptr != 0)
> ! /* FIXME: Should do some error checking here. */
> ! exp_in_base = strtol (expptr, (char **) 0, exp_base);
> else
> exp_in_base = 0;
> --- 272,298 ----
>
> if (expptr != 0)
> ! {
> ! /* Scan and convert the exponent, in base exp_base. */
> ! long dig, neg = -(long) ('-' == expptr[0]);
> ! expptr -= neg; /* conditional increment */
> ! c = (unsigned char) *expptr++;
> ! dig = digit_value[c];
> ! if (dig >= exp_base)
> ! {
> ! TMP_FREE;
> ! return -1;
> ! }
> ! exp_in_base = dig;
> ! c = (unsigned char) *expptr++;
> ! dig = digit_value[c];
> ! while (dig < exp_base)
> ! {
> ! exp_in_base = exp_in_base * exp_base;
> ! exp_in_base += dig;
> ! c = (unsigned char) *expptr++;
> ! dig = digit_value[c];
> ! }
> ! exp_in_base = (exp_in_base ^ neg) - neg; /* conditional negation */
> ! }
> else
> exp_in_base = 0;
>
Yep - can't find any problem with that :-)
Cheers,
Rob
More information about the gmp-bugs
mailing list