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???

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

## 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

## 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

## 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.

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

## Re: max value of an integer scalar

am 03.11.2005 15:19:37 von Shawn Corey

> 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.
>
>

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