Математика произвольной точности в PHP

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

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

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


person parent5446    schedule 05.08.2011    source источник
comment
Теоретически оба позволяют использовать числа ЛЮБОЙ длины, если они подаются в библиотеку в виде строк. Это сводится к тому, у кого лучше API для ваших целей. bc работает исключительно со строками, в то время как gmp может принимать строки, но также использует свои собственные внутренние представления.   -  person Marc B    schedule 05.08.2011
comment
Примечание: для работы с арифметикой произвольной точности вы можете использовать библиотеку, такую ​​как brick/math, которая использует GMP, BCMath или даже простой PHP за кулисами автоматически, в зависимости от доступности каждого расширения. Таким образом, вам не нужно выбирать между GMP и BCMath, и у вас будет хороший объектно-ориентированный API для экспериментов.   -  person BenMorel    schedule 17.10.2016


Ответы (2)


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

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

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

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

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

person mjv    schedule 05.08.2011
comment
Спасибо за ответ! У меня есть еще две вещи, которые нужно прояснить. Есть ли причина использовать BCD вместо обычных целых чисел? И BCMath, и GMP принимают BCD, а также обычные целые числа[/floats для BCMath]? - person parent5446; 07.08.2011
comment
Ни BCMath, ни GMP не принимают значения, выраженные в BCD. Преимущество BCD (по сравнению со строками с одной цифрой или специальным символом, таким как точка или знак минус и т. д.) заключается в том, что BCD более компактен: хранит 2, а не 1, цифры в байте, оставаясь при этом легко сопоставляемым с числовым представлением. (конкретная цифра в номере соответствует ровно одному и только одному полубайту). Одним из недостатков BCD является то, что он не может быть представлен в строках C (из-за возможного появления 2 нулей, которые путаются с завершающим нулем. - person mjv; 08.08.2011
comment
Как правило, вам не нужно/не нужно использовать BCD, но этот формат иногда является внутренним форматом арифметических библиотек произвольной точности, а также используется для специальных приложений. - person mjv; 08.08.2011
comment
Это действительно пролило много света. Это означает, что расширение BCMath подходит для расчетов, связанных с деньгами. Даже клиентская библиотека PHP API Blockchain советует использовать BCMath для расчетов биткойнов! Примечание: никогда не забывайте указывать масштаб (обычно это третий параметр)! - person Ema4rl; 12.02.2017

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

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

person neubert    schedule 10.10.2012