PHP 日本研討會 2024

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
用於轉換 字串 表示的基底。 明確的基底可以是 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");'

資源 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");'

資源 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