Разработчику. Сборник рецептов PHP
Задавайте вопросы

Работа с очень большими и очень маленькими числами

Вернуться назад

Задача

Необходимо работать с числами, выходящими из диапазона допустимых в PHP значений чисел с плавающей точкой.

Решение

Для этого нужна либо библиотека BCMath, либо библиотека GMP.

Применение BCMath:

$sum = bcadd('1234567812345678', '8765432187654321');

// переменная $sum равна теперь '9999999999999999'
print $sum;

Применение GMP:

$sum = gmp_add('1234567812345678', '8765432187654321');

// $sum теперь ресурс GMP, а не строка; для преобразования
// используйте функцию gmp_strval()

print gmp_strval($sum);

Обсуждение

Библиотека BCMath проста в применении. Числа передаются как строки, а функция возвращает сумму (или разность, произведение и т. д.) в виде строки. Однако набор действий, которые можно производить над числами с помощью библиотеки BCMath, ограничен основными арифметическими операциями.

Библиотека GMP доступна начиная с версии PHP 4.0.4. Большинство представителей семейства функций библиотеки GMP в качестве аргументов принимают целые и строки, но они преимущественно обмениваются числами в виде ресурсов, которые, по сути дела, представляют собой ссылки на числа. Поэтому, в противоположность функциям BCMath, которые возвращают строки, функции GMP возвращают только ресурсы. Последние передаются затем любой функции GMP, которая работает с ними как с числами.

Единственной оборотной стороной медали является то, что при работе с не-GMP функциями необходимо непосредственно конвертировать ресурсы с помощью функции gmp_strval() или функции gmp_intval().

Функции GMP либерально относятся к входным параметрам. Например:

$four = gmp_add(2, 2);            // Передаем целые
$eight = gmp_add('4', '4');            // Или строки
$twelve = gmp_add($four, $eight);            // Или ресурсы GMP
print gmp_strval($twelve);            // Печатаем 12

Впрочем, с числами GMP можно совершать множество операций помимо сложения, таких как возведение в степень, быстрое вычисление больших факториалов, нахождение наибольшего общего делителя (НОД) и других:

// Возведение числа в степень
$pow = gmp_pow(2, 10);            // 1024

// Быстрое вычисление больших факториалов
$factorial = gmp_fact(20);             // 2432902008176640000

// Нахождение НОД
$gcd = gmp_gcd (123, 456);            // 3

// Другой нестандартный математический инструментарий
$legdendre = gmp_legendre(1, 7);            // 1

Библиотеки BCMath и GMP не обязательно доступны во всех конфигурациях PHP. Начиная с версии PHP 4.0.4 библиотека BCMath связана с PHP, поэтому она, вероятно, должна быть легко доступна. Однако если библиотека GMP не связана с PHP, то необходимо ее загрузить, инсталлировать и в процессе конфигурирования проинструктировать PHP об использовании этой библиотеки. Проверьте значения функций function_defined('bcadd') и function_defined('gmp_init') чтобы определить, можно ли использовать библиотеки BCMath и GMP.

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования

Рейтинг Сайтов ДОСКИ.РУ