[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