max value of an integer scalar
# max value of an integer scalar

am 03.11.2005 09:50:00 von JeeBee
Dear Perl experts,

The following subroutine contains a while loop that continues to

multiply $p by 2, until some condition is met.

(It's for computing a Collatz tree)

$p turns 0 in this loop, however, and it remains zero for ever, of course.

My question is, what is exactly its maximum value? As I have been browsing

the web for a while, but am unable to find this information for Perl data

types. (I know I could perhaps use BigIntegers, but don't know whether

that would be really necessary).

Is there a difference between 'long' and 'int' or something in Perl???

Thanks in advance.

sub left_child_of($) {

my $p = shift;

print "Left of $p\n";

die("3 |/| p-1 (p = $p)") if ($p-1) % 3 != 0;

$p = ($p-1) / 3;

print "L$p\n";

# keep multiplying by 2, until 3|p-1 and 2 |/| p-1

while((($p-1) % 3 != 0) || (($p-1) % 2 == 0)) {

print "L$p: 3 |/| p-1\n" if ($p-1) % 3 != 0;

print "L$p: 2 | p-1\n" if ($p-1) % 2 == 0;

$p <<= 1;

}

return $p;

}

--

To unsubscribe, e-mail: beginners-unsubscribe@perl.org

For additional commands, e-mail: beginners-help@perl.org

## Re: max value of an integer scalar

am 03.11.2005 11:34:09 von krahnj
JeeBee wrote:

> Dear Perl experts,

Hello,

> The following subroutine contains a while loop that continues to

> multiply $p by 2, until some condition is met.

> (It's for computing a Collatz tree)

> $p turns 0 in this loop, however, and it remains zero for ever, of course.

>

> My question is, what is exactly its maximum value?

$ perl -le'use POSIX;

print for SHRT_MAX, INT_MAX, LONG_MAX, FLT_MAX, DBL_MAX;

'

32767

2147483647

2147483647

3.40282346638529e+38

1.79769313486232e+308

> As I have been browsing

> the web for a while, but am unable to find this information for Perl data

> types. (I know I could perhaps use BigIntegers, but don't know whether

> that would be really necessary).

>

> Is there a difference between 'long' and 'int' or something in Perl???

perldoc perlnumber

> sub left_child_of($) {

> my $p = shift;

> print "Left of $p\n";

> die("3 |/| p-1 (p = $p)") if ($p-1) % 3 != 0;

> $p = ($p-1) / 3;

> print "L$p\n";

> # keep multiplying by 2, until 3|p-1 and 2 |/| p-1

> while((($p-1) % 3 != 0) || (($p-1) % 2 == 0)) {

> print "L$p: 3 |/| p-1\n" if ($p-1) % 3 != 0;

> print "L$p: 2 | p-1\n" if ($p-1) % 2 == 0;

> $p <<= 1;

You are not multiplying $p by 2 like you said which would do what you want:

$p *= 2;

> }

> return $p;

> }

John

--

use Perl;

program

fulfillment

--

To unsubscribe, e-mail: beginners-unsubscribe@perl.org

For additional commands, e-mail: beginners-help@perl.org

## Re: max value of an integer scalar

am 03.11.2005 12:02:21 von JeeBee
Thank you, John!

I see the limit is 32 bits now.

I just added 'use bigint', how easy!

Further, I was wondering about why you said I wasn't just multiplying by

2 using $p<<=1. Isn't it exactly equal to $p*=2 ???

This has anything to do with overflow or the representation of a number?

I though using two-s complement it wouldn't make any difference.

Thanks for you help.

>> $p <<= 1;

>

> You are not multiplying $p by 2 like you said which would do what you want:

>

> $p *= 2;

use strict;

use bigint;

my $max_depth = shift;

$max_depth = 7 unless defined($max_depth);

sub output_tree($$);

sub left_child_of($) {

my $p = shift;

die("3 |/| p-1 (p = $p)") if ($p-1) % 3 != 0;

$p = ($p-1) / 3;

if($p % 3 == 0) {

# stop, there is no left tree

return $p;

}

# keep multiplying by 2, until 3|p-1 and 2 |/| p-1

while((($p-1) % 3 != 0) || (($p-1) % 2 == 0)) {

$p <<= 1;

}

return $p;

}

--

To unsubscribe, e-mail: beginners-unsubscribe@perl.org

For additional commands, e-mail: beginners-help@perl.org

## Re: max value of an integer scalar

am 03.11.2005 12:14:45 von Adriano Ferreira
On 11/3/05, JeeBee wrote:

>

> Thank you, John!

> I see the limit is 32 bits now.

> I just added 'use bigint', how easy!

>

> Further, I was wondering about why you said I wasn't just multiplying by

> 2 using $p<<=3D1. Isn't it exactly equal to $p*=3D2 ???

It is equal just up to the moment the result goes over the maximum

integer value. This is a build-dependent parameter, being 2**32 - 1 or

2**64 - 1, according to the Config value ivsize.

perl -V:ivsize

That is, the maximum integer is something like 2**(ivsize*8) - 1.

The shift is an integer-type operation and will produce the same weird

results you see in programming C with an integer of the same type. For

example, in a perl which uses 64-bit integers:

$ perl -e 'print 1<<63, " ", 1<<64'

9223372036854775808 1

But the multiplication operator (*) is smarter and does an upgrade

from integer to floating point when needed, (possibly) increasing the

range of the correct results.

Adriano.

--

To unsubscribe, e-mail: beginners-unsubscribe@perl.org

For additional commands, e-mail: beginners-help@perl.org

## Re: max value of an integer scalar

am 03.11.2005 15:19:37 von Shawn Corey
Adriano Ferreira wrote:

> But the multiplication operator (*) is smarter and does an upgrade

> from integer to floating point when needed, (possibly) increasing the

> range of the correct results.

>

> Adriano.

>

What JeeBee has stumbled across is a field of study called Numerical

Analysis. For a brief introduction see

http://en.wikipedia.org/wiki/Numerical_analysis

You are correct in that the multiplication operator automatically

converts from integer to float for large values of $p but JeeBee needs

an integer algorithm. For example, he uses ($p-1) % 3, which is only

defined for non-negative integers. The problem is for large values of

$p, $p == $p - 1. This is because floats only store a fixed number of

digits. For example, if it stores 3 digits and $p = 1_000_000, then $p-1

is 1.000e6 - 1 or 1.000e6. The one's column has dropped off the bottom;

it is too small to be recorded in the float.

I recommend that JeeBee takes his algorithm to a mailing list on

Numerical Analysis. They will have a lot more experience with the

foibles of computers doing simple arithmetic.

--

Just my 0.00000002 million dollars worth,

--- Shawn

"Probability is now one. Any problems that are left are your own."

SS Heart of Gold, _The Hitchhiker's Guide to the Galaxy_

--

To unsubscribe, e-mail: beginners-unsubscribe@perl.org

For additional commands, e-mail: beginners-help@perl.org