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

Задача
Необходимо работать с числами, выходящими из дапазона допустимых в 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.
Теги:
bcadd, gmp_add, gmp_strval
Добавлено: 17 Июля 2018 07:37:57 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...