我目前正在尝试弄清楚如何在 PHP 中使用任意精度数字。所以我想我的第一个问题是任意精度数学到底是什么。我尝试在谷歌上搜索一个好的定义,但由于某种原因,没有人能用足够简单的词语来表达它。
其次,PHP中的BCMath和GMP库有什么区别?我听说过 GMP 的 API“更新鲜”,但我不知道。有一个更好吗?
我的最后一个问题是 BCMath/GMP 采用什么类型的数字。显然,它需要字符串形式的普通整数(例如“5.34”),但我见过 BCMath 函数直接与表示常规整数的八位字节字符串一起使用的实现(例如“\x12\x23\x45\x67”),我将其听说被称为“bigint”,但 Google 再次没有为我提供任何结果。
最佳答案
任意精度数学到底是什么?
任意精度算术又名“bignum math”,引入了一种对数字执行算术运算的方法,其位数仅受可用内存量的限制。这与主机系统的 CPU/ALU 提供的固定精度算术不同,其中所表示数字的最大大小/精度是寄存器位数的一个因素这些硬件处理器。
固定精度算术在存储方面速度快、效率高,并且是内置的/通用的。然而,它适用于有限的(如果有时“足够大”)数值范围。任意精度运算速度较慢,有点浪费存储空间,并且需要专门的库,例如 GMP 或 BCMath。
BCMath 和 GMP 库之间有什么区别
最显着的区别是 GMP 适用于[任意精度]整数值,而 BCMath 允许[任意精度]小数/类似 float 的值。
这两个 API 都不难学,但 BCMath 可能更直观一些(除了支持类似浮点值之外)
人们对特定库的选择通常是由预期用途(或给定平台上的可用性)决定的。在您深入研究 MP 应用程序之前,大多数库都符合要求并且通常是等效的(当然在其类别内,即如果您需要 float ,请避免仅使用整数库)。
BCMath/GMP 采用什么类型的数字?
与大多数任意精度数学包一样,这两个库使用字符串作为其 API,即表示其输入和输出数值。
在内部...一些软件包(例如 GMP)有自己的数字表示形式。此类结构的具体特征通常是最小化存储需求和允许快速计算之间的折衷(包括将此类结构“序列化/反序列化”到文本文件或从文本文件“序列化/反序列化”。)
问题中的示例 "\x12\x23\x45\x67"
称为 BCD即二进制编码的十进制。它允许每个字节存储 2 位十进制数字,有时由任意精度算术库使用。
关于php - PHP 中的任意精度数学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6961685/