PHP中使用BCMath和GMP处理极大数和极小数
在PHP中我们可以使用PHP内置的极大(或极小)的浮点型数。
使用BCMath或者GMP库。
使用BCMath
$sum = bcadd('1234567812345678', '8765432187654321');
// $sum is now the string '9999999999999999'
print $sum;
使用GMP
$sum = gmp_add('1234567812345678', '8765432187654321');
// $sum is now a GMP resource, not a string; use gmp_strval() to convert
print gmp_strval($sum);
BCMath库使用很方便。只需将数字作为字符串传入,函数就能返回两个数的和(或者差、积等)。然而,使用BCMath库进行数字操作的范围仅限于基本的算术运算。
另外一个可用的库是GMP库。多数GMP函数库的成员都接受整数和字符串作为参数,但最好是传递数字作为资源——其本质是指向数字的指示器。因此,不同于BCMath库的函数(它们返回字符串),GMP函数只返回资源。然后,可以把这个资源传递给任何GMP函数,让这个资源来充当数字。
唯一的不足是,当你想要查看或者通过一个非GMP函数使用这个资源时,你还需要明确地使用gmp_strval()或者gmp_intval()函数对其进行转换。
GMP函数对可接受的参数类型很开放。例如通过GMP数值做加法:
<?php
$four = gmp_add(2, 2); // You can pass integers
$eight = gmp_add('4', '4'); // Or strings
$twelve = gmp_add($four, $eight); // Or GMP resources
print gmp_strval($twelve); // Prints 12
?>而且,不仅能通过GMP数值来做加法,还能通过其实现对一个数的升幂操作、快速地计算大阶乘、找出最大公因数(GCD)等其他常见的数学问题的计算,如下例通过GMP库计算常见的数学问题:
<?php // Raising a number to a power $pow = gmp_pow(2, 10); // 1024 // Computing large factorials very quickly $factorial = gmp_fact(20); // 2432902008176640000 // Finding a GCD $gcd = gmp_gcd (123, 456); // 3 // Other fancy mathematical stuff $legdendre = gmp_legendre(1, 7); // 1 ?>BCMath和GMP库并不是所有PHP必须启用的配置。BCM库是同PHP绑定的,所以它可能是有效的。然而,GMP库并没有与PHP绑定,所以你还需要下载并安装这个库,然后还要通过配置告诉PHP可以使用它。通过检查function_defined('bcadd')和function_defined('gmp_init')的返回值,可以知道BCMath和GMP库是否有效。如果你使用的是Windows系统,则必须在PHP 5.1或以上版本中才能使用GMP库。
另一个高精度数学运算的选择是PECL的big_int库,如下例使用big_int库实现加法:
<?php
$two = bi_from_str('2');
$four = bi_add($two, $two);
print bi_to_str($four) // Prints 4
// Computing large factorials very quickly
$factorial = bi_fact(20); // 2432902008176640000
?>这个库比BCMath要快,而且几乎与GMP库一样强大。不过,GMP库基于LGPL许可,而big_int则是基于BSD许可的。
OK,PHP中使用BCMath和GMP处理极大数和极小数就介绍到这里了。
转载请注明:http://www.itivy.com/php/archive/2012/2/18/php-bcmath-and-gmp.html