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! :-)