maximum integer size?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • yawnmoth

    maximum integer size?

    I'm trying to figure out how big integers in PHP can be and am having
    some difficulty.

    My first idea was to try something like this:

    <?
    for ($bits=0; (1<<($bits+1)) > (1<<$bits); $bits++);
    echo $bits;
    ?>

    The result was 30. This, however, is incorrect as the following
    demonstrates:

    <?
    $num = 1<<30;

    echo "num = $num\r\n";
    echo 'num<<1 = '.($num<<1)."\r \n";
    echo 'num*2 = '.($num*2)."\r\ n";
    ?>

    That my first idea would return the wrong result doesn't surprise me,
    though, since bitwise operators in PHP are treated as arithematic ones
    and not logical ones.

    So I came up with another test.

    <?
    for ($bits=0; pow(2,$bits+1) > pow(2,$bits); $bits++);
    echo $bits;
    ?>

    In Windows XP, I got 1024 back. On Linux 2.6.13.2 and 2.4.28 (as
    reported by phpinfo), all I get are timeout errors. So I decided to
    make my script more efficient and hopefully faster:

    <?
    $x = 2;
    $y = 1;
    for ($bits=1; ($x*=2) > ($y*=2); $bits++);
    echo $bits;
    ?>

    On Windows XP, I again got 1024 back, whereas on Linux, I again got
    timeout errors.

    All in all, this leaves me a little confussed as to how to interpret
    the results. Can integers in PHP be of an infinite precission when
    running on Linux? If so, what's the point of the BCMath / GMP
    functions on Linux?

    Also, if this is the case, then how would I go about writting an
    infinite precission integer arithmetic library that wasn't OS
    dependant? I could make it work on Windows by using the bcmath
    functions, since Windows builds of PHP include them by default, and use
    PHP's normal integer stuff on Linux (Linux builds of PHP don't include
    bcmath by default). But what about all the other platforms for which
    PHP is available on? What about Mac OS X / OS/2 / etc? Would it be
    safe to assume that if PHP's built-in integer functions didn't support
    infinite precission that it'd include support for bcmath?

  • Michael

    #2
    Re: maximum integer size?

    In answer to you linux time out problem, run it on the command line
    then it wont turn out. This command should do the trick I think: php -a
    [file path, not remote path].

    I think the length of the integer is dependant on the number of bits
    the computer is so 32bit or 64 bit. You are running a 32bit computer,
    yes? So 32 squared (1024) is the length, whereas if you were using
    64bit then it would be 64 squared (4096)

    Comment

    • Joe Attardi

      #3
      Re: maximum integer size?

      yawnmoth wrote:[color=blue]
      > I'm trying to figure out how big integers in PHP can be and am having
      > some difficulty.[/color]
      [color=blue]
      >From http://us3.php.net/intval :[/color]

      "The maximum value depends on the system. 32 bit systems have a maximum
      signed integer range of -2147483648 to 2147483647. So for example on
      such a system, intval('1000000 000000') will return 2147483647. The
      maximum signed integer value for 64 bit systems is 922337203685477 5807."

      Comment

      • Michael Austin

        #4
        Re: maximum integer size?

        Michael wrote:[color=blue]
        > In answer to you linux time out problem, run it on the command line
        > then it wont turn out. This command should do the trick I think: php -a
        > [file path, not remote path].
        >
        > I think the length of the integer is dependant on the number of bits
        > the computer is so 32bit or 64 bit. You are running a 32bit computer,
        > yes? So 32 squared (1024) is the length, whereas if you were using
        > 64bit then it would be 64 squared (4096)
        >[/color]

        Since you are requesting this in the PHP newsgroup, a search for INTEGER in the
        PHP docs yields:

        Get the integer value of a variable


        "The maximum value depends on the system. 32 bit systems have a maximum signed
        integer range of -2147483648 to 2147483647. So for example on such a system,
        intval('1000000 000000') will return 2147483647. The maximum signed integer value
        for 64 bit systems is 922337203685477 5807."


        Another point is that may have more to do with the OS you are on. So, if you
        are running a 32bit OS on a 64bit CPU, the max integer value will still be
        2147483647. It really has more to do with the compilers, math libraries and OS
        limitations as well as those of the cpu type.

        --
        Michael Austin.
        Consultant
        Donations welcomed. Http://www.firstdbasource.com/donations.html
        :)

        Comment

        Working...