(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)
gmp_init — Crée un nombre GMP
Crée un nombre GMP, à partir d'un entier ou d'une chaîne.
numUn entier ou une chaîne de caractères. La chaîne peut être une représentation décimale, hexadécimale, octale ou binaire.
baseLa base à utiliser pour convertir une représentation sous forme de string .
Une base explicite peut être comprise entre 2 et 62.
Pour les bases jusqu'à 36, la casse est ignorée :
les lettres majuscules et minuscules ont la même valeur.
Pour les bases de 37 à 62,
les lettres majuscules représentent les valeurs de 10 à
35 et les lettres minuscules représentent les valeurs de
36 à 61.
Si base vaut 0, alors la base réelle
est déterminée à partir des caractères initiaux de num.
Si les deux premiers caractères sont 0x ou 0X,
la chaîne est interprétée comme un entier hexadécimal.
Si les deux premiers caractères sont 0b ou 0B,
la chaîne est interprétée comme un entier binaire.
Si les deux premiers caractères sont 0o ou 0O,
la chaîne est interprétée comme un entier octal.
De plus, si le premier caractère est 0, la chaîne
est également interprétée comme un entier octal.
Dans tous les autres cas, la chaîne est interprétée comme un entier décimal.
Un objet GMP .
| Version | Description |
|---|---|
| 8.1.0 |
La prise en charge des préfixes octaux explicites 0o et
0O a été ajoutée pour les chaînes de caractères
num. L'interprétation de ces préfixes lorsque
base vaut 0 a également été ajoutée.
|
Exemple #1 Création d'un nombre GMP
<?php
$a = gmp_init(123456);
$b = gmp_init("0xFFFFDEBACDFEDF7200");
?>Note:
Il n'est pas nécessaire d'appeler cette fonction pour utiliser les entiers ou les chaînes à la place de nombre GMP dans les fonctions GMP, comme gmp_add() . Les arguments de ces fonctions sont automatiquement convertis en nombres GMP, si cette conversion est possible et nécessaire, en utilisant les mêmes règles que gmp_init().
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.
}
?>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 #4I 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.Missing from the documentation: gmp_init() return false in case it failed to parse $num
<?php
var_dump(gmp_init(""));
// returns "bool(false)" and not a GMP object as hinted by the documentation, it also triggers a Warning "PHP Warning: gmp_init(): Unable to convert variable to GMP - string is not an integer in php shell code on line 1"
?>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
?>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.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! :-)