Bill Allombert on Tue, 3 Apr 2001 22:07:06 +0200


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: [GP/PARI-2.1.0] arithmetic weirdness


On Mon, Apr 02, 2001 at 09:15:16AM +0200, Philippe Elbaz-Vincent wrote:
> (09:30) gp > .1
> time = 0 ms.
> %25 = 0.09999999999999999999999999999

I feel it is indeed a bug in PARI :

consider the following computation:

? (2^96\10)/2^96+0.
%10 = 0.09999999999999999999999999999
? (2^96\/10)/2^96+0.
%11 = 0.1000000000000000000000000000

The second result seem more accurate, since we
use the smallest residue.

We can check it:

? a=abs((2^96\10)/2^96-1/10)
%19 = 3/396140812571321687967719751680
? b=abs((2^96\/10)/2^96-1/10)
%20 = 1/198070406285660843983859875840
? a>b
%21 = 1

Internally :

? (2^96\10);
? \x
[&=080de15c] INT(lg=5,CLONE):03000005  (+,lgef=5):40000005  19999999  99999999  99999999
? (2^96\/10);
? \x
[&=080de1ec] INT(lg=5,CLONE):03000005  (+,lgef=5):40000005  19999999  99999999  9999999a
?

(the 0x9 has been rounded up to 0xa, which is better since next hexa is a 9)

So the best representation of .1 is the second one, that lead
to the expected result.

However this bug lie deep in the pari parser.
aaaa.bbbb is read as:

A=aaaa; B=bbbb; n=<number of digit of B>;
result: A+B/10.^n

It is easy to fix but the main problem is that

? 1/10.
%1 = 0.09999999999999999999999999999

Does other systems (outside those using base ten numbers) have this
problem ?

(fix:compute p=lgefint(B);
then result is A+(2^p*B\/10^n)/2^p

Bill.