(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)
gmp_init — Создаёт GMP-число
Функция создаёт GMP-число из целого числа или строки.
numbase2 и 62.
Параметр игнорирует регистр числа для оснований до 36 включительно;
строчные и заглавные буквы эквивалентны.
Для оснований от 37 до 62
буквы в верхнем регистре представляют значения от 10
до 35, а в нижнем —
от 36 до 61.
Функция определяет основание по начальным символам аргумента num,
если основание base равно 0.
Строка интерпретируется как шестнадцатеричное число,
если первые два символа равны 0x или 0X.
Строка интерпретируется как двоичное число, если первые два символа числа равны
0b или 0B.
Строка интерпретируется как восьмеричное число,
если первые два символа равны 0o или 0O.
Больше того, если первый символ в первом аргументе равен 0,
строка тоже интерпретируется как восьмеричное число.
В остальных случаях строка интерпретируется как десятичное целочисленное значение.
Объект класса GMP .
| Версия | Описание |
|---|---|
| 8.1.0 |
Для строковых аргументов num
добавили поддержку явных восьмеричных префиксов 0o
и 0O.
Интерпретацию таких префиксов, когда значение основания base
равно 0, тоже добавили.
|
Пример #1 Пример создания GMP-числа
<?php
$a = gmp_init(123456);
$b = gmp_init("0xFFFFDEBACDFEDF7200");
?>Замечание:
Не обязательно вызывать функцию при передаче вместо GMP-числа целочисленного значения или строки в GMP-функции наподобие функции gmp_add() . Аргументы функций автоматически преобразуются в GMP-числа по правилам функции 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! :-)