Произвольная математика в PHP - PullRequest
10 голосов
/ 05 августа 2011

В настоящее время я пытаюсь понять, как работать с числами произвольной точности в PHP. Поэтому я думаю, что мой первый вопрос - что такое математика произвольной точности? Я попробовал поискать в Google для хорошего определения, но почему-то никто не может выразить это достаточно простыми словами.

Во-вторых, каковы различия между библиотеками BCMath и GMP в PHP? Я слышал заявления о том, что API GMP «свежее», но не слишком. Один лучше?

И мой последний вопрос, какой тип чисел принимает BCMath / GMP. Очевидно, он принимает нормальные целые числа в строковой форме (например, «5.34»), но я видел реализации, где функции BCMath использовались непосредственно со строками октетов, представляющими обычные целые числа (например, «\ x12 \ x23 \ x45 \ x67»), которые Вы слышали, как меня называют "bigint", но опять Google ничего не дал мне.

Ответы [ 2 ]

16 голосов
/ 06 августа 2011

Что такое математика с произвольной точностью?
Арифметика с произвольной точностью, известная как "bignum math", представляет способ выполнения арифметических операций над числами, количество цифр которых толькоограничено объемом доступной памяти.Это идет вразрез с арифметикой с фиксированной точностью , которая предоставляется процессорами / ALU хост-систем и где максимальный размер / точность представленного числа является фактором количества битов регистровэти аппаратные процессоры.

Арифметика с фиксированной точностью является быстрой, эффективной в отношении хранилища и является встроенной / универсально доступной.Однако это применимо к ограниченным (если только иногда «достаточно большим») числовым диапазонам.Арифметика произвольной точности медленнее, несколько расточительна для хранилища и требует специализированных библиотек, таких как GMP или BCMath.

В чем различия между библиотеками BCMath и GMP
Самым существенным отличием является то, что GMP работает с [произвольной точностью] целыми числами значениями, в результате чего BCMath допускает [произвольную точность] десятичных / плавающих значений.
Ни один API не являетсятрудно выучить, но BCMath может быть немного более интуитивным (в дополнение к поддержке значений типа float)

Выбор одной библиотеки над другой обычно обусловлен предполагаемым использованием (илиналичие на данной платформе).До тех пор, пока вы не углубитесь в MP-приложения, большинство библиотек будут соответствовать требованиям и в целом будут эквивалентны (в пределах своего класса, конечно, то есть избегать только целочисленных библиотек, если вам нужны числа с плавающей запятой).

какой тип чисел принимает BCMath / GMP?
Как и в большинстве математических пакетов произвольной точности, эти две библиотеки используют строки для своего API, то есть для представления своих входных и выходных числовых значений.
Внутренне... Некоторые пакеты, такие как GMP, имеют собственное представление для чисел.Специфика таких структур обычно представляет собой компромисс между минимизацией требований к хранилищу и возможностью быстрых вычислений (включая «сериализацию / десериализацию» таких структур в / из текстовых файлов.)
Пример "\x12\x23\x45\x67" в вопросе известен как BCD т.е. двоично-десятичный десятичный.Он позволяет хранить 2 десятичных знака на байт и иногда используется библиотеками Arbitrary Precision.

4 голосов
/ 10 октября 2012

GMP на тонну быстрее BCMath, хотя BCMath стал быстрее благодаря OpenSSL.Вот тест, сравнивающий различные методы:

http://phpseclib.sourceforge.net/math/intro.html

...