2024年PHP开发者大会(日本)

gmp_init

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

gmp_init创建GMP数

描述

gmp_init(int|string $num, int $base = 0): GMP

从整数或字符串创建一个GMP数。

参数

num
一个整数或一个字符串。字符串表示可以是十进制、十六进制、八进制或二进制。
base
用于转换string表示的基数。 显式基数可以在262之间。对于高达36的基数,大小写不敏感;大写字母和小写字母具有相同的值。对于3762的基数,大写字母表示1035的值,小写字母表示3661的值。 如果base0,则实际基数由num的前导字符确定。如果前两个字符是0x0X,则字符串被解释为十六进制整数。如果前两个字符是0b0B,则字符串被解释为二进制整数。如果前两个字符是0o0O,则字符串被解释为八进制整数。此外,如果第一个字符是0,则字符串也被解释为八进制整数。在所有其他情况下,字符串被解释为十进制整数。

返回值

一个GMP对象。

变更日志

版本 描述
8.1.0 num字符串添加了对显式八进制前缀0o0O的支持。base0时对这些前缀的解释也已添加。

示例

示例 #1 创建GMP数

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

注释

注释:

不必为了在GMP函数中使用整数或字符串代替GMP数而调用此函数(例如使用gmp_add())。如果可能并且需要,函数参数将自动转换为GMP数,使用的规则与gmp_init()相同。

参见

添加注释

用户贡献的注释 7条注释

php at richardneill dot org
18年前
以下是如何将十进制数(例如3.25)解析为整数和指数的方法

<?
if (preg_match("/^[0-9]+\.[0-9]+$/",$input)){
//输入是十进制数。根据需要进行乘法运算以去除小数点。
//将其转换为gmp_resource,然后递减指数
//进行补偿。

$pieces=explode(".", $input); //在小数点处分割。
$input="$pieces[0]$pieces[1]"; //去除小数点。

$input=ltrim($input,'0');
//去除任何前导零,否则gmp_init将把数字解析为八进制。

if ($input==''){ //处理“0.0”,否则将是''。
$input=0;
}
$integer=gmp_init($input);
$ns_exponent=-strlen($pieces[1]);
//指数 = (-) 小数点后字符的数量。
}
?>
karl dot debisschop at pearson dot com
13年前
除非基数为16,否则如果字符串以“0b”开头,gpm_init将失败。

> php -r '$v = gmp_init("b83", 17); print("$v\n");'

Resource id #4

> php -r '$v = gmp_init("0b83", 17); print("$v\n");'

[什么也没有打印]

在我的情况下,当明确指定基数时,解决方案是首先应用ltrim

> php -r '$v = gmp_init(ltrim("0b83", "0"), 17); print("$v\n");'

Resource id #4
marcus at synchromedia dot co dot uk
13年前
我发现gmp函数对基数16使用[0-9a-f],但对基数17到62使用[0-9A-Za-z](即大写字母优先)。这与我发现的大多数基数62实现不同,后者倾向于先使用小写字母。
php at richardneill dot org
18年前
注意:前导零将使gmp_init将其解析为八进制。
因此gmp_init(010)变为8。

$a=010; //8
$b="010" + 0; //10
$c=gmp_strval(gmp_init(010)); //8
$d=gmp_strval(gmp_init("010")); //8

此行为不一致:$d应该等于$b,或者
$b应该等于$a。
Aurelien Marchand
2年前
文档中缺少:如果gmp_init()无法解析$num,则返回false

<?php
var_dump
(gmp_init(""));
// 返回 "bool(false)" 而不是文档中暗示的GMP对象,它还会触发警告 "PHP Warning: gmp_init(): Unable to convert variable to GMP - string is not an integer in php shell code on line 1"

?>
charlie at oblivion dot cz
17年前
gmp_* 函数不接受以“+”开头的字符串
<?php
echo gmp_strval(gmp_init('+42')); #0
echo gmp_strval(gmp_add('42', '+42')); #42
echo bcadd('+42', '+42'); #84
?>
thomas dot hebinck at digionline dot de
19年前
如果直接使用整数作为参数调用gmp_*函数,则此整数不能为0

for($i=-1;$i<=1;$i++) { echo gmp_strval(gmp_add(2,gmp_mul(1,$i))) . ' '; }

结果是1 0 3(错误)

在这种情况下,您必须使用gmp_init()

for($i=-1;$i<=1;$i++) { echo gmp_strval(gmp_add(2,gmp_mul(1,gmp_init($i)))) . ' '; }

结果是1 2 3(正确)

祝您计算愉快! :-)
To Top