簡體   English   中英

PHP中的任意精度數學

[英]Arbitrary-Precision Math in PHP

我目前正試圖弄清楚如何使用PHP中的任意精度數字。 所以我想我的第一個問題是究竟什么是任意精度數學。 我試着谷歌搜索一個很好的定義,但由於某種原因,沒有人可以用簡單的語言。

其次,PHP中的BCMath和GMP庫有什么區別? 我聽說GMP的API是“更新鮮”,但是我很高興。 一個更好嗎?

我最后的問題是BCMath / GMP需要什么類型的數字。 顯然它需要字符串形式的正常整數(例如“5.34”),但我已經看到了BCMath函數直接用於表示常規整數的八位字節字符串的實現(例如“\\ x12 \\ x23 \\ x45 \\ x67”),其中我聽說被稱為“bigint”,但谷歌再也沒有給我帶來任何好處。

什么是任意精度數學?
任意精度算術又稱“bignum數學”,介紹了一種對數字執行算術運算的方法,其數字位數僅受可用存儲量的限制。 這與主機系統的CPU / ALU提供的固定精度算法不同 ,並且所表示的數字的最大大小/精度是這些硬件處理器的寄存器的位數的因子。

固定精度算法在存儲方面快速,高效,並且內置/普遍可用。 然而,它適用於有限的(如果僅有時“足夠大”)數值范圍。 任意精度算術都比較慢,有點浪費存儲,需要專門的庫,如GMP或BCMath。

BCMath和GMP庫之間有什么區別
最顯着的區別是GMP在[任意精度] 數值上工作,因此BCMath允許[任意精度] 十進制 /浮點數值。
這兩種API都難以學習,但BCMath可能更直觀(除了支持浮點數值)

一個特定庫的選擇優於另一個庫,通常由預期用途(或給定平台上的可用性)驅動。 在你深入研究MP應用程序之前,大多數庫都符合要求並且通常是等效的(當然在它的類中,即如果你需要浮點數,則避免使用整數庫)。

BCMath / GMP采用什么類型的數字?
與大多數任意精度數學包一樣,這兩個庫使用字符串作為其API,即表示其輸入和輸出數值。
內部......像GMP這樣的一些軟件包有自己的數字表示。 這種結構的具體情況通常是在最小化存儲要求和允許快速計算(包括將這些結構“序列化/反序列化”到文本文件中/從文本文件中進行“快速計算”之間的折衷。)
問題中的示例"\\x12\\x23\\x45\\x67"稱為BCD,即二進制編碼的十進制。 它允許每個字節存儲2個十進制數字,有時由任意精度算術庫使用。

盡管使用OpenSSL可以使BCMath更快,但GMP速度更快。 這是比較各種技術的基准:

http://phpseclib.sourceforge.net/math/intro.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM