• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • gmp_init()

    (PHP 4 >= 4.0.4, PHP 5, PHP 7)

    Create GMP number

    说明

    gmp_init(mixed $number[,int $base= 0]): GMP

    Creates a GMP number from an integer or string.

    参数

    $number

    An integer or a string. The string representation can be decimal, hexadecimal or octal.

    $base

    The base.

    The base may vary from 2 to 36. If base is 0(default value), the actual base is determined from the leading characters: if the first two characters are0xor0X, hexadecimal is assumed, otherwise if the first character is "0", octal is assumed, otherwise decimal is assumed.

    返回值

    GMP 数值资源.

    更新日志

    版本说明
    5.3.2 The$basewas extended from 2 to 36, to 2 to 62 and -2 to -36.

    注释

    Note:

    To use the extended base introduced in PHP 5.3.2, then PHP must be compiled against GMP 4.2.0 or greater.

    范例

    Creating GMP number

    <?php
    $a = gmp_init(123456);
    $b = gmp_init("0xFFFFDEBACDFEDF7200");
    ?>
    

    注释

    Note:

    It is not necessary to call this function in order to use integers or strings in place of GMP numbers in GMP functions(such as with gmp_add()). Function arguments are automatically converted to GMP numbers, if such conversion is possible and needed, using the same rules as gmp_init().

    I discovered that the gmp functions use [0-9a-f] up to base 16, but [0-9A-Za-z] (i.e. upper case first) from bases 17 to 62. This differs from most of the base-62 implementations I've found that tend to use lower case first.
    Here's a way to parse a decimal (eg 3.25) into an integer and exponent:
    <?
    if (preg_match("/^[0-9]+\.[0-9]+$/",$input)){ 
       //Input is a base-10 decimal. Multiply as necessary to remove the decimal
       //point. Convert that to a gmp_resource, then decrement the exponent 
       //to compensate.
       $pieces=explode(".", $input);   //Split at the d.p.
       $input="$pieces[0]$pieces[1]"; //Remove the decimal point.
       $input=ltrim($input,'0');  
       //Remove any leading zeros, or gmp_init will parse the number as octal.
       if ($input==''){  //Deal with "0.0" which would otherwise be ''.
         $input=0;
       }
       $integer=gmp_init($input);  
       $ns_exponent=-strlen($pieces[1]); 
       //exponent = (-) the number of characters after the decimal point.
    }
    ?>
    
    Note: Leading zeros will make gmp_init parse this as octal.
    Thus gmp_init(010) becomes 8. 
    $a=010;       //8
    $b="010" + 0;   //10
    $c=gmp_strval(gmp_init(010));  //8
    $d=gmp_strval(gmp_init("010")); //8
    This behaviour is inconsistent: either $d should equal $b, or
    $b should equal $a.
    Unless the base is 16, gpm_init will fail if the string begins with "0b". 
    > php -r '$v = gmp_init("b83", 17); print("$v\n");'
    Resource id #4
    > php -r '$v = gmp_init("0b83", 17); print("$v\n");'
    [nothing prints]
    In may case, where I am explicitly specifying the base, the solution is to apply ltrim first:
    > php -r '$v = gmp_init(ltrim("0b83", "0"), 17); print("$v\n");'
    Resource id #4
    gmp_* functions don't accept strings with a leading '+':
    <?php
    echo gmp_strval(gmp_init('+42'));   #0
    echo gmp_strval(gmp_add('42', '+42')); #42
    echo bcadd('+42', '+42');       #84
    ?>
    
    If you call a gmp_* function directly with an interger as parameter, this integer MUST NOT be 0:
    for($i=-1;$i<=1;$i++) { echo gmp_strval(gmp_add(2,gmp_mul(1,$i))) . ' '; }
    The result is 1 0 3 (wrong)
    In this case you have to use gmp_init():
    for($i=-1;$i<=1;$i++) { echo gmp_strval(gmp_add(2,gmp_mul(1,gmp_init($i)))) . ' '; }
    The result is 1 2 3 (right)
    Happy number crunching! :-)

    上篇:gmp_import()

    下篇:gmp_intval()