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

进制。

进制可以从 2 到 62。如果进制为 0(默认值),则实际进制将根据前导字符确定:如果前两个字符为 0x0X,则假设为十六进制,如果前两个字符为 0b0B,则假设为二进制,否则如果第一个字符为 0,则假设为八进制,否则假设为十进制。对于 36 以下的进制,不区分大小写;大写字母和小写字母的值相同。对于 37 到 62 的进制,大写字母代表通常的 10 到 35,而小写字母代表 36 到 61。

返回值

一个 GMP 对象。

示例

示例 #1 创建 GMP 数字

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

注释

注意:

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

参见

添加注释

用户贡献的注释 7 个注释

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

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

$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](即先是大写字母)。这与我发现的大多数 base-62 实现不同,它们倾向于先使用小写字母。
php at richardneill dot org
17 年前
注意:前导零将使 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
18 年前
如果您直接使用整数作为参数调用 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