13.3. Функции обработки чисел произвольной точности
Двойные вещественные числа обычно дают существенно более точное значение для числового анализа, чем это бывает необходимо для вычислений. Но PHP может предложить способ, позволяющий обрабатывать числа с более высокой точностью. При этом для хранения сверхдлинных чисел с плавающей точкой используются строки. Все они используют значение масштаба, которое представляет собой количество цифр, расположенных справа от десятичной точки. Аргумент scale, задаваемый во всех этих функциях, является необязательным, и в случае его указания отменяется стандартное значение масштаба. Функция bcscale, описанная в главе 15, "Настройка", позволяет задавать значение масштаба по умолчанию.
Эти функции являются частью расширения bcmath и двоичного дистрибутива ОС Windows, но не активизируются по умолчанию при инсталляции в других операционных системах. Если PHP сообщает, что эти функции не распознаны, PHP потребуется перекомпилировать с заданием параметра -enable-bcmath.
PHP также поддерживает расширение для GNU MP, известное как GMP. На время на­писания данной книги это расширение поддерживало только целочисленное представление. Подробнее о GMP можно узнать на Web-узле <http://www.swox.com/gmp/>.
Функции, работающие с числами произвольной точности, показаны в листинге 13.32.
string bcadd(string left, string right, integer scale)
Функция bcadd прибавляет значение, заданное аргументом left, к значению, заданному аргументом right. integer bccomp(string left, string right, integer scale)
Функция bccomp сравнивает значение, заданное аргументом left, со значением, заданным аргументом right. Если они равны, возвращается нуль. Если значение left меньше right, возвращается -1. Если значение left больше right, возвращается значение 1.
string bcdiv(string left, string right, integer scale)
Функция bcdiv делит значение, заданное аргументом left, на значение, заданное аргументом right.
string bcmod(string left, string right)
Функция bcmod определяет модуль от деления значения, заданного аргументом left, на значение, заданное аргументом right.
string bcmul(string left, string right, integer scale)
Функция bcmul умножает значение, заданное аргументом left, на значение, заданное аргументом right.

Листинг 13.32. Функции обработки чисел произвольной точности

<?php
//11.1111111000
print(bcadd("1.234567890", "9.87654321", 10) . '<br>'); //1, т.е. первый больше второго
print(bccomp("12345","1.111111111111", 10) . '<br>'); //0.1250075946
print(bcdiv("12345", "98754", 10) . '<br>'); //121134
print(bcmod("66394593", "133347") . '<br>');
//8853519792771
print(bcmul("66394593", "133347", 10) . '<br>'); //292683432083423203645857 print(bcpow("66394593", "3", 10) . '<br>'); //35.1364056215
print(bcsqrt("1234.567", 10) . '<br>'); //1146
print(bcsub("1234.4842", "88.6674") . '<br>');
?>

string bcpow(string value, string exponent, integer scale)
Функция bcpow возводит значение, заданное аргументом value, в степень значения, заданного аргументом exponent. Если значение аргумента exponent не является целым, то отсекается дробная часть полученного числа.
string bcpowmod(string value, string exponent, string mod, integer scale)
Функция bcpowmod возвращает значение числа, возведенного в степень exponent, минус модуль этого числа. 
string bcsqrt(string value, integer scale)
Функция bcsqrt возвращает квадратный корень из значения, заданного аргументом value.
string bcsub(string left, string right, integer scale)
Функция bcsub вычитает значение, заданное аргументом right, из значения, заданного аргументом left.