PHP中的任意精度数学

时间:2011-08-05 19:35:07

标签: php biginteger gmp arbitrary-precision bcmath

我目前正在尝试弄清楚如何使用PHP中的任意精度数字。所以我想我的第一个问题是究竟什么是任意精度数学。我尝试使用谷歌搜索获得了一个很好的定义,但出于某种原因,没有人可以用简单的语言来表达它。

其次,PHP中的BCMath和GMP库有什么区别?我听说GMP的API是“更新鲜”,但是我很高兴。一个更好吗?

我最后的问题是BCMath / GMP需要什么类型的数字。显然它需要字符串形式的正常整数(例如“5.34”),但我已经看到了BCMath函数直接用于表示常规整数的八位字节字符串的实现(例如“\ x12 \ x23 \ x45 \ x67”),其中我听说被称为“bigint”,但谷歌再一次没有为我提供任何东西。

2 个答案:

答案 0 :(得分:15)

究竟什么是精确数学?
任意精度算术又称“bignum数学”,介绍了一种对数字执行算术运算的方法,其数字位数仅受可用存储量的限制。这与主机系统的CPU / ALU提供的固定精度算术不同,其中所表示的数字的最大大小/精度是寄存器的位数的一个因子。这些硬件处理器。

固定精度算法在存储方面快速,高效,并且内置/普遍可用。然而,它适用于有限的(如果仅有时“足够大”)数值范围。任意精度算术都比较慢,有点浪费存储空间,需要专门的库,如GMP或BCMath。

BCMath和GMP库之间有什么区别
最显着的区别是GMP适用于[任意精度] 整数值,因此BCMath允许[任意精度] 十进制 /类似浮点值。
这两个API都难以学习,但BCMath可能更直观(除了支持浮点数值)

特定库的选择通常由预期用途(或给定平台上的可用性)驱动。在你深入研究MP应用程序之前,大多数库都符合要求并且通常是相同的(当然在它的类中,如果你需要浮点数,则避免使用整数库)。

BCMath / GMP采用什么类型的号码?
与大多数任意精度数学包一样,这两个库使用字符串作为其API,即表示其输入和输出数值 内部......像GMP这样的一些软件包有自己的数字表示。这种结构的具体情况通常是在最小化存储要求和允许快速计算(包括将这些结构“序列化/反序列化”到文本文件中/从文本文件中进行快速计算)之间的折衷。)
问题中的示例"\x12\x23\x45\x67"称为BCD,即二进制编码的十进制。它允许每个字节存储2个十进制数字,有时由任意精度算术库使用。

答案 1 :(得分:4)

尽管BCMath使用OpenSSL速度更快,但GMP速度更快。这是比较各种技术的基准:

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