targetsmart has asked for the
wisdom of the Perl Monks concerning the following question:
Hi monks,
I made a scalar variable to hold an integer value and kept incrementing that scalar, now what is the maximum value that it can hold, exactly the unsigned int size or it will be different in perl.
Re: maximum value of a scalar
by JavaFan (Canon) on Oct 21, 2008 at 09:33 UTC

It will be different in Perl. First of all, Perl doesn't know integers  at least not on the Perl language level. Perl has numerical values.
Now, your question is ambiguous. I can put 1e100 in a scalar variable, and it will hold this. However, if I put 0 in a scalar, and repeatedly increment that by 1, I will never reach 1e100 because of loss of significancy.
But even if your question is "what is the largest integer a scalar can hold without losing significancy?", then the answer is "it depends". It depends on whether your perl uses 64 bit integers, or 32 bit integers. In the former case, the answer is 2**631, or 9223372036854775807. If you have 32 bit integers, the answer is not 2**311, but much higher. perl then uses a double to store the integer, but a double has enough bits to not lose precision for a while. I don't know where exactly the cutoff is, but I recall it's around 2**53.  [reply] 
Re: maximum value of a scalar
by ikegami (Pope) on Oct 21, 2008 at 21:58 UTC

For 32bit version of Perl, the maximum integer (without using bigint or similar) that can be stored precisely is 2^{53} on the negative side and 2^{53} on the positive side.
>perl e"printf qq{%.f\n}, 2**53+$_ for +1,0,1"
9007199254740992
9007199254740992
9007199254740991
>perl e"printf qq{%.f\n}, 2**53+$_ for +1,0,1"
9007199254740991
9007199254740992
9007199254740992
build settings  Max positive integer  Max negative integer 
32bit ints and double floats  2^{53} = 9_007_199_254_740_992  2^{53} = 9_007_199_254_740_992 
64bit ints and double floats  2^{64}1 = 18_446_744_073_709_551_615  2^{63} = 9_223_372_036_854_775_808 
64bit ints and quadruple floats  2^{113} = 10_384_593_717_069_655_257_060_992_658_440_192  2^{113} = 10_384_593_717_069_655_257_060_992_658_440_192 
Some operators (notably the bit operators) won't work with every number in that range.
Some C extensions won't work with every number in that range.
 [reply] [d/l] 

I'm trying to compile for quadruple floats, and it's not obvious to me what the parameter is during configure.
Suggestions?
Thanks,
Scott
 [reply] 

I'm trying to compile for quadruple floats
What is your compiler's C data type for these "quadruple floats" ? I had assumed that, if a C compiler could handle "quadruple floats", it would be handling them as "long doubles"  in which case building with Duselongdouble might do the trick.
Cheers, Rob
 [reply] [d/l] 



Sorry, none. I have no knowledge on the topic.
 [reply] 
Re: maximum value of a scalar
by BrowserUk (Pope) on Oct 21, 2008 at 16:12 UTC

Without moving to using Math::BigInt and the like, the largest integer perl can hold in a scalar is 9,007,199,254,740,992. Albeit that it is actually held as a double (8byte floating point) internally.
Examine what is said, not who speaks  Silence betokens consent  Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
 [reply] 
Re: maximum value of a scalar
by ig (Vicar) on Oct 21, 2008 at 21:26 UTC

You might find the answer to your question in http://perldoc.perl.org/perlnumber.html.
As a reult of how Perl handles numbers, the answer to your question is somewhat complex and dependent on how your perl was compiled. Small integer numbers may be stored internally as integers or floating point numbers with no loss of information, but integers exceeding the limits of the internal integer representation can only be stored as floating point numbers. Floating point numbers have limited precision and for sufficiently large values the difference between one number and the next larger number that can be represented is greater than 1. At this limit, the numbers stop behaving as integers, at least for some operations. This is because, while larger integer values are possible, not all larger integer values are possible. For example, adding 1 to such a large value may not result in any change.
 [reply] 
Re: maximum value of a scalar
by ccn (Vicar) on Oct 21, 2008 at 09:17 UTC

ccn@laptop:~$ perl MPOSIX le 'print LONG_MAX'
2147483647
ccn@laptop:~$
 [reply] [d/l] 

If that's not enough, you can always use Modules like Math::BigInt to use integers as large as you want (or at least up to the size of your computers memory).
 [reply] 

you can always use Modules like Math::BigInt
Excellent observation  and such large numbers are, after all, stored in scalars  as per the OP's requirement.
The one limitation of Math::BigInt is that it's pure perl and can therefore be a little slow when it comes to manipulating those numeric values. As an alternative one could look at modules like Math::GMP, Math::Pari and Math::MPFR. These modules, like Math::BigInt, all store their values in sclarars and they still suffer from the "available memory" limitation  and, unlike Math::BigInt, they all depend upon external C libraries. The one big difference in their favour is that they provide much faster arithmetic manipulation of the bignum values than Math::BigInt.
Cheers, Rob
 [reply] 


That's wrong. LONG_MAX is a C constant, made available to you. It may say something about the maximum signed integer perl uses internally, but it's not the same maximum integer Perl can use. (Note the significant capitalization of the italic words).
 [reply] 

