PHP 中的任意精度数学

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

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

我的最后一个问题是BCMath / GMP需要什么类型的数字。显然,它采用字符串形式的普通整数(例如“5.34”),但是我见过BCMath函数直接与表示常规整数的八位字节字符串一起使用的实现(例如“\x12\x23\x45\x67”),我听说它被称为“bigint”,但Google再次没有为我提供任何结果。


答案 1

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

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

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

一个人选择一个特定的库而不是另一个库通常是由预期用途(或给定平台上的可用性)驱动的。在你大量进入MP应用程序之前,大多数库将符合要求并且通常是等效的(当然,在其类中,即如果您需要浮点数,请避免仅使用整数库)。

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


答案 2

GMP是更快的BCMath,尽管BCMath可以使用OpenSSL更快。以下是比较各种技术的基准测试:

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


推荐