2011-08-05 109 views
7

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

其次,PHP中的BCMath和GMP庫有什麼區別?我聽說GMP的API是「新鮮的」,但idk。更好嗎?

而我最後的問題是什麼類型的BCMath/GMP採取的數字。很明顯,它需要字符串形式的正常整數(例如「5.34」),但我已經看到了BCMath函數直接用於表示常規整數的八位字符串(例如「\ x12 \ x23 \ x45 \ x67」)的實現,其中I聽說被稱爲「bigint」,但Google再一次對我沒有任何幫助。

+0

理論上都允許使用任意長度的數字,只要他們送入庫作爲字符串。它歸結爲具有更好的API用於您的目的。 bc純粹使用字符串,而gmp可以接受字符串,但也使用自己的內部表示。 –

+0

注意:要使用任意精度算術,您可以使用一個庫,例如[磚/數學](https://github.com/brick/math),它會在後臺自動使用GMP,BCMath甚至純PHP ,這取決於每個擴展的可用性。這樣你就不必在GMP和BCMath之間選擇,並且有一個很好的面向對象的API。 – Benjamin

回答

12

究竟什麼是任意精度的數學?
任意精度算術aka「bignum math」,引入了一種對數字進行算術運算的方式,其中數字的位數只受可用存儲量的限制。這與主機系統的CPU/ALU提供的固定精度算術不同,並且其中所表示的數字的最大尺寸/精度是這些硬件處理器的寄存器的位數的因數。

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

哪些bcmath時和GMP庫之間的差異
最顯着的區別是,GMP適用於[任意精度] 整數值,由此bcmath時允許[任意精度] 小數 /浮類似的價值觀。
既不API難學,但bcmath時可以更直觀的一個位(除了支持浮動狀值)

一種優於另一種典型地由預期用途驅動的特定庫的一個的選擇(或由特定平臺的可用性)。在大量進入MP應用程序之前,大多數庫都會適合賬單並且通常是等價的(在其課程當中,即如果您需要浮點數,則避免使用整數庫)。

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

+0

感謝您的回答!我只有兩件事要澄清。是否有理由將BCD用於常規整數? BCMath和GMP都接受BCD以及常規整數[/ BCMath的漂浮物]? – parent5446

+0

BCMath和GMP均不接受以BCD表示的值。 BCD的優點(與具有一位數字或特殊字符的字符串比如點或減號等相比)是BCD更加緊湊:每個字節存儲2比1位更大的數字,同時可以輕鬆映射到數字的表示形式(數字中的特定數字對應於只有一個半字節)。 BCD的一個缺點是它不能用C字符串表示(因爲可能發生2個零與空終止符混淆) – mjv

+0

通常,_you_不想/不需要使用BCD,但是這種格式有時是內部格式的任意精度算術庫,並且它也被用於特殊應用 – mjv