В настоящее время я пытаюсь выяснить, как работать с номерами произвольной точности в PHP. Поэтому я предполагаю, что мой первый вопрос будет состоять именно в том, что такое математика с произвольной точностью. Я попробовал Googling для хорошего определения, но почему-то никто не может выразить это достаточно простыми словами.
Во-вторых, каковы различия между библиотеками BCMath и GMP в PHP? Я слышал, что API GMP является «более свежим», но idk. Это лучше?
И мой последний вопрос будет состоять в том, какой тип чисел BCMath / GMP занимает. Очевидно, что он принимает нормальные целые числа в строковой форме (например, «5.34»), но я видел реализации, в которых функции BCMath использовались непосредственно с октетными строками, представляющими обычные целые числа (например, «\ x12 \ x23 \ x45 \ x67»), которые я «Вы слышали, как его называли« bigint », но снова Google ничего не дал для меня.
что такое математика с произвольной точностью?
Произвольная арифметика точности, например, «bignum math», вводит способ выполнения арифметических операций над числами, количество которых ограничено только объемом доступной памяти. Это находится в исходе с арифметикой с фиксированной точностью, которая обеспечивается CPU / ALU хост-систем и где максимальный размер / точность представленного числа является фактором количества бит регистров этих аппаратных процессоров.
Арифметика с фиксированной точностью является быстрой, эффективной в отношении хранения и встроена / универсально доступна. Однако он применим к ограниченным (хотя бы иногда «большим») числовым диапазонам. Произвольная арифметика точности медленнее, несколько расточительна для хранения и требует специализированных библиотек, таких как GMP или BCMath.
каковы различия между библиотеками BCMath и GMP
Самым существенным отличием является то, что GMP работает с целыми значениями [произвольной точности], в результате чего BCMath допускает значения [произвольной точности] десятичных / плавающих значений.
Никому из API трудно научиться, но BCMath может быть немного интуитивно понятным (в дополнение к поддержке значений типа float)
Выбор определенной библиотеки над другой, как правило, обусловлен предполагаемым использованием (или наличием на данной платформе). До тех пор, пока вы не начнете активно работать с MP-приложениями, большая часть библиотеки будет соответствовать законопроекту и, как правило, эквивалентна (в пределах его класса, конечно, т.е. избегайте целочисленной библиотеки, если вам нужны числа с плавающей запятой).
какой тип номеров BCMath / GMP занимает?
Как и в большинстве произвольных математических математических пакетов, эти две библиотеки используют строки для своего API, т. Е. Представляют их числовые значения ввода и вывода.
Внутренне … Некоторые пакеты, такие как GMP, имеют собственное представление чисел. Специфика таких структур обычно представляет собой компромисс между минимизацией требований к хранению и возможностью быстрых вычислений (в том числе «сериализации / десериализации» таких структур в / из текстовых файлов.)
Пример "\x12\x23\x45\x67"
в вопросе известен как BCD, т.е. двоичное кодированное десятичное число. Он позволяет хранить 2 десятичных цифры на каждый байт и иногда используется в арифметических библиотеках произвольной точности.
GMP – это тонна быстрее BCMath, хотя BCMath ускоряется с использованием OpenSSL. Вот сравнительный тест, сравнивающий различные методы: