| Vasili Burdo on Thu, 16 Jul 2015 18:11:31 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: Support of binary and hexadecimal integers in PARI/GP |
Hi, Bill
>Do not trouble yourself, I did it already, see GIT branch bill-binary-hex.
Thanks.
See another patch in attachment for this branch - it fixes strtor() function.
Had to introduce decimal-only function int_read_dec(), so for real
numbers integer part is always parsed as decimal.
And, looks like my changes for printing hex break functions concat()
and default() - they become sensitive to base selected.
For example, concat("abc"+123) returns "abc123" of decimal is used and
"abc0x7b" if hex is used.
Now I'm looking for a way to limit hex output to GP only.
Please, do not apply patches I sent yesterday to MASTER.
I'll post updated patch for MASTER later.
Thanks,
Vasili
2015-07-16 11:35 GMT+03:00 Bill Allombert <Bill.Allombert@math.u-bordeaux.fr>:
> On Thu, Jul 16, 2015 at 01:53:50AM +0300, Vasili Burdo wrote:
>> >Even so, this is still worthwhile to do.
>> Ok. Will deliver tomorrow.
>
> Do not trouble yourself, I did it already, see GIT branch
> bill-binary-hex.
>
>> >I assume your patch was created to apply to PARI 2.7.4 ?
>> No, it's for master - i.e. trunk.
>> I'm new to git - work mostly w/ perforce and svn
>
> Your patch only applied to PARI 2.7.4 though, I had to forward port it.
>
>> >Your patch changes the result of strtoi
>> Hm, could you point me to the test which fails?
>>
>> >? strtoi("0b111")
>> >%1 = 7
>> >instead of 0.
>> Hm, silent failure in basecase and something useful w/ my changes.
>> Looks like my change is better :)
>
> Well, this is not a silent failure (it stop reading at the first non digit
> character), but it happens it was not documented, so it is probably OK, though
> the documentation of strtoi need to be updated.
>
> Cheers
> Bill.
>
diff --git a/src/language/anal.c b/src/language/anal.c
index 1eed58f..9a3cc4d 100644
--- a/src/language/anal.c
+++ b/src/language/anal.c
@@ -653,6 +653,15 @@ real_read(pari_sp av, const char **s, GEN y, long prec)
}
static GEN
+int_read_dec(const char **s)
+{
+ int nb;
+ GEN y = utoi(number(&nb, s));
+ if (nb == MAX_DIGITS) y = int_read_more(y, s);
+ return y;
+}
+
+static GEN
int_read(const char **s)
{
int nb;
@@ -666,8 +675,7 @@ int_read(const char **s)
if (nb == MAX_XDIGITS) y = hex_read_more(y, s);
} else
{
- y = utoi(number(&nb, s));
- if (nb == MAX_DIGITS) y = int_read_more(y, s);
+ y = int_read_dec(s);
}
return y;
}
@@ -679,7 +687,7 @@ GEN
strtor(const char *s, long prec)
{
pari_sp av = avma;
- GEN y = int_read(&s);
+ GEN y = int_read_dec(&s);
y = real_read(av, &s, y, prec);
if (typ(y) == t_REAL) return y;
return gerepileuptoleaf(av, itor(y, prec));