做一个勇于分享的php园丁

PHP开发园地

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

标签: PHP, BCMath, GMP
Posted by php园丁 @ 2012-2-18 23:17:35 阅读(146) 评论(0)
上一篇:PHP生成随机数详解
下一篇:PHP中查出当前的日期和时间

我也来参与讨论

你还可以输入600/600个字符 发表评论
称呼: (必填) 登录 | 开通博客
邮箱: (选填) 你的邮箱地址不会被公开
网站: (选填)
验证码: (必填)
看不清换一张 看不清楚换一张