Произвольная математика в PHP

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

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

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

2 ответа

Решение

что такое математика произвольной точности?
Арифметика произвольной точности, известная как "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.

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

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

Другие вопросы по тегам