i trying to figure out what's wrong as well so i do the following:

$j = -9223372036854775808;
foreach my $i (10,100,1000,10000){
 $j-=$i;
        printf "still equal after subtracting $i: %f",$j if ($j
=  -9223372036854775807);
        print "\nbits of \$j is: ",bit_p($j),"\n";
}

print bit_p($a),"\n";

sub bit_p{
 my $number = shift;
 my @buffer;
 while(1){
  last unless($number);
  if($number & 1){
   unshift(@buffer,"1");
  }else{
   unshift(@buffer,"0");
  }
  $number >>= 1;
 }
 return join('',@buffer);
}

__END__

prints:

still equal after subtracting 10: -9223372036854775800.000000
bits of $j is: 10000000000000000000000000000000
still equal after subtracting 100: -9223372036854775800.000000
bits of $j is: 10000000000000000000000000000000
still equal after subtracting 1000: -9223372036854775800.000000
bits of $j is: 10000000000000000000000000000000

bits of $j is: 10000000000000000000000000000000


as you can see even after subtracting 1000, it's still the same.
if you count the number of bits in $j, it has 32. Perl is using a 32 bit
address (in my OS) to store $j. the max for a 32 big integer is 2 ^ 32 which
is 4294967296. after that, it overflows. if you look at the bit pattern of
$j, it's a '-0' conceptually. and when you test it in the 'if' statment, it
will always be ture because:

if(-0 == -0){
    print "equal\n";
}

always prints equal. this should explain why after you subtract one from it,
it's still prints ok.

the overflow thingy that i mention doesn't seem to affect the following
though:

$i = '9'x99; #-- that's 99 digits! definitly overflow

print $i+1,"\n"; #-- prints 1e+099 which is correct!

i am still puzzle and searching for the right answer.

david

"Geeta Kathpalia" <[EMAIL PROTECTED]> wrote in message
[EMAIL PROTECTED]">news:[EMAIL PROTECTED]...
> Thanks for the reply Janek.
>
> If the number is converted to float, then as the result shows, the
> number is truncated a bit,
> from -9223372036854775808 to -9.22337203685478e+18.
> If yes, then how come
> printf "ok %f", $a;
> still gives the correct number(without truncation).
> The output is : ok -9223372036854775808.000000
>
> Thanks & Regards
> Geeta



-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to