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

Задача
Необходимо работать с числами, выходящими из дапазона допустимых в 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.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Взятие логарифмов
Вычисление степеней
Вычисление тригонометрических функций
Вычисления с не десятичными числами
Генерация случайных чисел в пределах диапазона

Вернуться в раздел: PHP / 2. Числа