Арбитражная точность в PHP

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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

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