【问题标题】:Arbitrary-Precision Math in PHPPHP中的任意精度数学
【发布时间】:2011-10-21 03:50:01
【问题描述】:

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

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

我的最后一个问题是 BCMath/GMP 需要什么类型的数字。显然它采用字符串形式的普通整数(例如“5.34”),但我已经看到 BCMath 函数直接与表示常规整数的八位字节字符串一起使用的实现(例如“\x12\x23\x45\x67”),我'听说被称为“bigint”,但谷歌又一次没有为我带来任何好处。

【问题讨论】:

  • 理论上两者都允许使用任意长度的数字,只要它们作为字符串输入库即可。它归结为具有更好的 API 来满足您的目的。 bc 纯粹使用字符串,而 gmp 可以接受字符串但也使用自己的内部表示。
  • 注意:要使用任意精度的算术,您可以使用诸如 brick/math 之类的库,它会在后台自动使用 GMP、BCMath 甚至纯 PHP,具体取决于每个扩展的可用性.这样您就不必在 GMP 和 BCMath 之间进行选择,并且可以使用一个不错的 OO API。

标签: php biginteger gmp arbitrary-precision bcmath


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢您的回答!我只有两点需要澄清。是否有理由在常规整数上使用 BCD? BCMath 和 GMP 是否都接受 BCD 以及常规整数 [/BCMath 的浮点数]?
  • BCMath 和 GMP 都不接受以 BCD 表示的值。 BCD 的优势(与具有一位数字或特殊字符(如点或减号等)的字符串相比)是 BCD 更紧凑:每个字节存储 2 位而不是 1 位,同时保持易于映射到数字的表示(数字中的特定数字恰好对应一个且只有一个半字节)。 BCD 的一个缺点是它不能用 C 字符串表示(因为可能出现 2 个零,这与空终止符混淆。
  • 通常,不想/不需要使用 BCD,但这种格式有时是任意精度算术库的内部格式,也用于特殊应用程序。
  • 这确实揭示了很多。这意味着 BCMath 扩展 是用于涉及金钱的计算的方式。甚至Blockchain's PHP API Client Library 也建议使用 BCMath 进行比特币计算! 注意:永远不要忘记指定你的比例(通常是第三个参数)!
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    相关资源
    最近更新 更多