Математические функции bcmath произвольной точности


Содержание

Быстрые логарифмы произвольной точности с bcmath

Вот что у меня есть

Но для выполнения bcln(100) требуется 5,7 секунды (естественный журнал 100, 10 знаков после запятой). Кроме того, он не всегда точнее для более десятичных знаков. Есть ли лучший алгоритм?

Для этого конкретного прогона требуется 573 итераций для определения результата.

Вам нужна строка произвольной длины в качестве ответа? Или вам нужна точность произвольная или произвольный размер экспоненты? Или. достаточно было бы иметь с плавающей запятой двойной ответ (возвращаемое значение); учитывая, что мы «только» работаем с логарифмом из числа «произвольных» размеров?

Числа с плавающей запятой двойной точности имеют 11-разрядный знак с индексом: поэтому, если ваша строка большого номера имеет длину ≤1022 бит ≈ 307 десятичных цифр (поэтому длина строки 306 символов, включая десятичную точку), вы в безопасности! Точнее, вы должны быть в безопасности, если абсолютное значение итогового десятичного показателя составляет ≤307. Вам нужны более крупные экспоненты? (Я полагаю, другими словами: работаете ли вы с реальными числами или теоретической/чистой математикой?)

Почему бы просто не использовать некоторую строковую обработку вместе с некоторой простой арифметикой журнала с плавающей запятой? Это должно быть очень быстро, для любых чисел в реальном мире.

Вы можете преобразовать базу, используя известную логарифмическую арифметику:

Я тестировал эти функции, и они работают для меня, для примеров, которые я предоставил; давая точно такие же ответы, как и калькулятор Windows 10, вплоть до пределов арифметики с двойной точностью, используемой PHP.

Если вам действительно требуется более 15 цифр точности и более 307 для десятичного показателя, вы можете реализовать свой собственный объект класса «BigFloat» и каким-то образом построить его методы из стандартного встроенного плавающего элемента, точечные функции с использованием подхода «разделяй и властвуй»! Тогда, возможно, мы могли бы использовать это как основу алгоритма логики с произвольной точностью с плавающей запятой, объединив его с описанными выше функциями/методами. Возможно, вам стоит подумать о консультациях с людьми в math.stackexchange.com, чтобы узнать больше о том, может ли это быть приемлемым подходом.

ОСНОВНОЕ ИЗОБРАЖЕНИЕ: вторая попытка.

Математические функции bcmath произвольной точности

Данные BC функции задействованы только при условии что PHP был скомпилирован в режиме —enable-bcmath, т.е. при включенных в конфигурацию bcmath функциях.

bcadd

bcadd — Сложение двух чисел произвольной точности.

Описание

string bcadd(string левый операнд, string правый операнд, int [ масштаб ]);

Прибавляет левый операнд к правому операнду и возвращает сумму типа string (строковая переменная). Факультативный параметрмасштаб используется чтобы установить количество разрядов после десятичной отметки в результате.

bccomp

bccomp — Сравнение двух чисел произвольной точности.

Описание

int bccomp(string левый операнд, string правый операнд, int [ масштаб ]);

Сравнивает левый операнд с правым операндом и возвращает результат типа integer (целое). Факультативный параметр масштаб используется для установки количества цифр после десятичной отметки, используемых при сравнении. При равенстве двух операндов возвращается значение 0. Если левый операнд больше правого операнда возврашается +1, и если левый операнд меньше правого операнда возвращается -1.

bcdiv

bcdiv — Операция деления для двух чисел произвольной точности.

Описание

string bcdiv(string левый операнд, string правый операнд, int [ масштаб ]);

Делит левый операнд на правый операнд и возвращает результат. Факультативный параметр масштаб устанавливает количество цифр после десятичной отметки в результате.

bcmod

bcmod — Получение модуля числа произвольной точности.

Описание

string bcmod (string левый операнд, string модуль);

Получение модуля левого операнда используя операнд модуль.

bcmul

bcmul — Операция умножения для двух чисел произвольной точности.

Описание

string bcmul (string левый операнд, string правый операнд, int [ масштаб ]);

Умножает левый операнд на правый операнд и возвращает результат. Факультативный параметр масштаб устанавливает количество цифр после десятичной отметки в результате.

bcpow


bcpow — Возведение одного числа произвольной точности в степень другого.

Описание

string bcpow (string x, string y, int [ масштаб ]);

Возведение x в степень y. Параметр масштаб может использоваться для установки количества цифр после десятичной отметки в результате.

bcscale

bcscale — Устанавливает масштаб по умолчанию для всех математических BC-функций

Описание

string bcscale (int масштаб);

Эта функция устанавливает заданный по умолчанию параметр масштаба для всех последующих математических BC-функций, которые явно не определяют параметр масштаба.

bcsqrt

bcsqrt — Получение квадратного корня числа произвольной точности.

Описание

string bcsqrt (string операнд, int масштаб);

Возвращает кваддратный корень операнда. Факультативный параметр масштаб устанавливает количество цифр после десятичной отметки в результате.

bcsub

bcsub — Вычитает одно число произвольной точности из другого.

Описание

string bcsub (string левый операнд, string правый операнд, int [ масштаб ]);

Вычитает правый операнд из левого операнда и возвращает результат типа string. Факультативный параметр масштаб устанавливает количество цифр после десятичной отметки в результате.

Справочник по PHP : Функции работы с данными : Математические функции : Функции повышенной точности BCMath

Материал из WebWikiABCD

Содержание

bcadd

Сложение двух чисел произвольной точности.

Эта функция возвращает строковое представление суммы двух параметров (left_operand + right_operand) с точностью, которая указана в необязательном параметре scale.

Точность (scale) указывает количество десятичных знаков после запятой).

bccomp

Сравнение двух чисел произвольной точности.

Сравнивает числа (left_operand с right_operand) и возвращает результат типа integer (целое). Параметр scale используется для установки количества цифр после десятичной отметки, используемых при сравнении. При равенстве двух частей возвращается значение 0. Если левая часть больше правой части возвращается +1, и если левая часть меньше правой части возвращается -1.

bcdiv

Операция деления для двух чисел произвольной точности.

Делит left_operand на right_operand и возвращает результат с точностью (знаками после запятой), заданной в параметре scale.

bcmod

Возвращает остаток целочисленного деления.

Данная функция возвращает остаток от целочисленного деления left_operand на modulus.

bcmul

Операция умножения для двух чисел произвольной точности.

Производит умножение left_operand на right_operand, и выдает результат в виде строки с точностью, заданной в переменной scale.


bcpow

Возведение одного числа произвольной точности в степень другого.

Возведение x в степень y. Параметр scale может использоваться для установки количества цифр после точки.

bcscale

Устанавливает точность вычислений.

Эта функция устанавливает заданную по умолчанию точность вычислений для всех математических функций BCMath, которые явно не определяют точность.

bcsqrt

Получение квадратного корня числа произвольной точности.

Возвращает квадратный корень аргумента operand. Параметр scale устанавливает количество цифр после десятичной отметки в результате.

bcsub

Вычитает одно число произвольной точности из другого.

Возвращает разность двух переменных, указанных в параметрах функции (left_operandright_operand) с точностью, указанной в необязательном параметре scale.

Математические функции bcmath произвольной точности

Данные BC функции задействованы только при условии что PHP был скомпилирован в режиме —enable-bcmath, т.е. при включенных в конфигурацию bcmath функциях.

bcadd

bcadd — Сложение двух чисел произвольной точности.

Описание

string bcadd(string левый операнд, string правый операнд, int [ масштаб ]);

Прибавляет левый операнд к правому операнду и возвращает сумму типа string (строковая переменная). Факультативный параметрмасштаб используется чтобы установить количество разрядов после десятичной отметки в результате.

bccomp

bccomp — Сравнение двух чисел произвольной точности.

Описание

int bccomp(string левый операнд, string правый операнд, int [ масштаб ]);

Сравнивает левый операнд с правым операндом и возвращает результат типа integer (целое). Факультативный параметр масштаб используется для установки количества цифр после десятичной отметки, используемых при сравнении. При равенстве двух операндов возвращается значение 0. Если левый операнд больше правого операнда возврашается +1, и если левый операнд меньше правого операнда возвращается -1.

bcdiv

bcdiv — Операция деления для двух чисел произвольной точности.

Описание

string bcdiv(string левый операнд, string правый операнд, int [ масштаб ]);

Делит левый операнд на правый операнд и возвращает результат. Факультативный параметр масштаб устанавливает количество цифр после десятичной отметки в результате.

bcmod

bcmod — Получение модуля числа произвольной точности.

Описание

string bcmod (string левый операнд, string модуль);

Получение модуля левого операнда используя операнд модуль.

bcmul

bcmul — Операция умножения для двух чисел произвольной точности.

Описание

string bcmul (string левый операнд, string правый операнд, int [ масштаб ]);

Умножает левый операнд на правый операнд и возвращает результат. Факультативный параметр масштаб устанавливает количество цифр после десятичной отметки в результате.


bcpow

bcpow — Возведение одного числа произвольной точности в степень другого.

Описание

string bcpow (string x, string y, int [ масштаб ]);

Возведение x в степень y. Параметр масштаб может использоваться для установки количества цифр после десятичной отметки в результате.

bcscale

bcscale — Устанавливает масштаб по умолчанию для всех математических BC-функций

Описание

string bcscale (int масштаб);

Эта функция устанавливает заданный по умолчанию параметр масштаба для всех последующих математических BC-функций, которые явно не определяют параметр масштаба.

bcsqrt

bcsqrt — Получение квадратного корня числа произвольной точности.

Описание

string bcsqrt (string операнд, int масштаб);

Возвращает кваддратный корень операнда. Факультативный параметр масштаб устанавливает количество цифр после десятичной отметки в результате.

bcsub

bcsub — Вычитает одно число произвольной точности из другого.

Описание

string bcsub (string левый операнд, string правый операнд, int [ масштаб ]);

Вычитает правый операнд из левого операнда и возвращает результат типа string. Факультативный параметр масштаб устанавливает количество цифр после десятичной отметки в результате.

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

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

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

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

Илон Маск рекомендует:  Что такое код javascript faq

2 ответов

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

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

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

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

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

Математические функции bcmath произвольной точности

Д анные BC функции задействованы только при условии что PHP был скомпилирован в режиме —enable-bcmath, т.е. при включенных в конфигурацию bcmath функциях.

bcadd — Сложение двух чисел произвольной точности.

Описание string bcadd(string левый операнд, string правый операнд, int [масштаб]);

П рибавляет левый операнд к правому операнду и возвращает сумму типа string (строковая переменная). Факультативный параметрмасштаб используется чтобы установить количество разрядов после десятичной отметки в результате.

bccomp — Сравнение двух чисел произвольной точности.

Описание int bccomp(string левый операнд, string правый операнд, int [масштаб]);

С равнивает левый операнд с правым операндом и возвращает результат типа integer (целое). Факультативный параметр масштаб используется для установки количества цифр после десятичной отметки, используемых при сравнении. При равенстве двух операндов возвращается значение 0. Если левый операнд больше правого операнда возврашается +1, и если левый операнд меньше правого операнда возвращается -1.


bcdiv — Операция деления для двух чисел произвольной точности.

Описание string bcdiv(string левый операнд, string правый операнд, int [масштаб]);

Д елит левый операнд на правый операнд и возвращает результат. Факультативный параметр масштаб устанавливает количество цифр после десятичной отметки в результате.

bcmod — Получение модуля числа произвольной точности.

Описание string bcmod(string левый операнд, string модуль);

П олучение модуля левого операнда используя операнд модуль.

bcmul — Операция умножения для двух чисел произвольной точности.

Описание string bcmul(string левый операнд, string правый операнд, int [масштаб]);

У множает левый операнд на правый операнд и возвращает результат. Факультативный параметр масштаб устанавливает количество цифр после десятичной отметки в результате.

bcpow — Возведение одного числа произвольной точности в степень другого.

Описание string bcpow(string x, string y, int [масштаб]);

В озведение x в степень y. Параметр масштаб может использоваться для установки количества цифр после десятичной отметки в результате.

С мотрите также bcsqrt().

bcscale — Устанавливает масштаб по умолчанию для всех математических BC-функций

Описание string bcscale(int масштаб);

Э та функция устанавливает заданный по умолчанию параметр масштаба для всех последующих математических BC-функций, которые явно не определяют параметр масштаба.

bcsqrt — Получение квадратного корня числа произвольной точности.

Описание string bcsqrt(string операнд, int масштаб);

В озвращает кваддратный корень операнда. Факультативный параметр масштаб устанавливает количество цифр после десятичной отметки в результате.

bcsub — Вычитает одно число произвольной точности из другого.

Описание string bcsub(string левый операнд, string правый операнд, int [масштаб]);

В ычитает правый операнд из левого операнда и возвращает результат типа string. Факультативный параметр масштаб устанавливает количество цифр после десятичной отметки в результате.

Обработка чисел и математические операции в PHP

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

Разработчики языка PHP приняли вполне обоснованный подход и не стали предпринимать какие-либо попытки снова изобретать колеса, предназначенные для указанной цели. Дело в том, что многие из наиболее фундаментальных математических функций, применяемых в языке PHP, являются просто оболочками вокруг аналогов этих функций на языке C.

Математические операции

Большинство математических действий в языке PHP осуществляется в форме встроенных функций, а не в форме операций. Кроме операций сравнения, язык PHP предлагает пять операций выполнения простых арифметических действий, а также некоторые сокращенные операции, позволяющие составлять более краткие выражения инкремента и декремента, а также присваивания.

Арифметические операции

К пяти основным арифметическим операциям относятся те операции, которые обычно реализованы в любом четырехфункциональном калькуляторе, а также операция деления по модулю (%). Краткое описание арифметических операций приведено в таблице:

Арифметические операции

Операция Описание
+ Возвращает сумму значений двух своих операндов
Если имеются два операнда, то значение правого операнда вычитается из значения левого. Если имеется только правый операнд, то операция возвращает значение этого операнда с обратным знаком
* Возвращает произведение значений двух своих операндов
/ Возвращает результат деления с плавающей точкой значения левого операнда на значение правого операнда
% Возвращает остаток от целочисленного деления значения левого операнда на абсолютное значение правого операнда

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

Операция деления по модулю (%) в языке PHP принимает целочисленные операнды, а если эта операция применяется к числам с плавающей точкой двойной точности, то эти числа предварительно преобразуются в целые числа (путем отбрасывания дробной части). Результатом такой операции всегда является целое число.

Операции инкремента и декремента

Значительная часть синтаксиса языка PHP унаследована от языка C, а программисты C славятся любовью к краткости и гордятся этим. Операции инкремента и декремента, взятые из языка C, позволяют более кратко представлять выражения типа $count = $count + 1, которые обычно встречаются в программах достаточно часто.

Операция инкремента (++) применяется для добавления единицы к значению той переменной, на которую распространяется эта операция, а операция декремента (—) вычитает единицу из значения такой переменной.

Каждая из этих двух операций имеет две разновидности — суффиксную (в этой форме знак операции помещается непосредственно вслед за переменной, на которую распространяется операция) и префиксную (в этой форме знак операции помещается непосредственно перед переменной, на которую распространяется операция). Обе разновидности имеют один и тот же побочный эффект, связанный с изменением значения переменной, но суффиксные и префиксные операции возвращают разные значения при использовании в качестве выражений. Суффиксная операция действует так, что значение переменной изменяется после возврата значения выражения, а префиксная операция действует таким образом, что вначале изменяется значение, а затем переменной возвращается новое значение. Указанное различие можно обнаружить, используя операции декремента и инкремента в операторах присваивания:

Приведенные операторы формируют следующий вывод в окне браузера:


В этом примере оператор $result = $count++ полностью эквивалентен операторам:

Наряду с этим оператор $result = ++$count эквивалентен таким операторам:

Операции присваивания

Операции инкремента (и декремента) позволяют уменьшить объем кода, необходимого для добавления единицы к значению переменной, но не позволяют сократить объем кода, в котором переменной присваивается результат сложения ее значения с другим числом или результат выполнения других арифметических действий. К счастью, все пять арифметических операций имеют соответствующие им операции присваивания (+=, -=, *=, /= и %=), позволяющие присвоить переменной в одном кратком выражении результат выполнения арифметической операции над значением этой переменной. Например, оператор

может быть сокращенно представлен таким

Простые математические функции

Следующий этап усложнения программы по сравнению с той, в которой применяются только арифметические операции, состоит в использовании всевозможных функций. Функции позволяют выполнять такие задачи, как преобразование из одного числового типа в другой (см. статью «Типы данных») и поиск минимального или максимального числа во множестве чисел. В следующей таблице представлены простые математические функции:

Простые математические функции PHP

Функция Описание
floor() Принимает единственный фактический параметр (как правило, число с плавающей точкой двойной точности) и возвращает наибольшее целое число, которое меньше или равно этому фактическому параметру (округление в меньшую сторону)
ceil() Имя этой функции представляет собой сокращение от слова ceiling (потолок). Функция принимает единственный фактический параметр (как правило, число с плавающей точкой двойной точности) и возвращает наименьшее целое число, которое больше или равно этому фактическому параметру (округление в большую сторону)
round() Принимает единственный фактический параметр (как правило, число с плавающей точкой двойной точности) и возвращает ближайшее целое число
abs() Модуль числа. Если единственный числовой фактический параметр имеет отрицательное значение, то функция возвращает соответствующее положительное число; если фактический параметр является положительным, то функция возвращает сам фактический параметр
min() Принимает любое количество числовых фактических параметров (но не менее одного) и возвращает наименьшее из всех значений фактических параметров
max() Принимает любое количество числовых фактических параметров (но не менее одного) и возвращает наибольшее из всех значений фактических параметров

Например, результат следующего выражения равен 3, поскольку значение каждого выражения с вызовом функции также равно 3:

Выработка случайных чисел

В языке PHP применяются два генератора случайных чисел (вызываемых соответственно с помощью функций rand() и mt_rand()). С каждым из этих генераторов связаны по три функции одинакового назначения: функция задания начального значения (srand() и mt_srand()), сама функция получения случайного числа и функция, осуществляющая выборку наибольшего целого числа, которое может быть возвращено генератором ((getrandmax() и mt_getrandmax())). Функции getrandmax() и mt_getrandmax() возвращают значение наибольшего числа, которое может быть возвращено функцией rand() или mt_rand(), на платформах Windows это значение ограничено величиной 32768.

Выбор конкретной функции выработки псевдослучайных чисел, которая используется в функции rand(), может зависеть от того, с какими именно библиотеками был откомпилирован интерпретатор PHP. В отличие от этого в генераторе mt_rand() всегда используется одна и та же функция выработки псевдослучайных чисел (mt — сокращение от Mersenne Twister), причем автор оперативной документации к функции mt_rand() утверждает, что эта функция к тому же является более быстродействующей и «более случайной» (с точки зрения криптографии), чем rand(). У нас нет оснований сомневаться в истинности этих утверждений, поэтому мы предпочитаем использовать функцию mt_rand(), а не rand().

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

Типичный способ задания начального значения для любого из генераторов случайных чисел PHP (с использованием функции mt_srand() или srand()) заключается в следующем:

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

Данный конкретный метод задания начального значения был глубоко продуман теми специалистами, которые полностью понимают все нюансы выработки псевдослучайных чисел, поэтому, скорее всего, навсегда останется лучшим по сравнению с любыми попытками какого-то отдельного программиста придумать что-то более «заковыристое».

Очевидно, что указанные функции выработки псевдослучайных чисел возвращают только целые числа, но случайное целое число из заданного диапазона можно легко преобразовать в соответствующее число с плавающей точкой (скажем, в число из диапазона от 0.0 до 1.0 включительно) с помощью выражения наподобие rand() / getrandmax(). После этого указанный диапазон можно масштабировать и сдвигать по мере необходимости. Ниже показан пример:

Попробуйте обновить страницу с этим кодом несколько раз, чтобы убедиться в генерации случайных чисел.

Математические константы

В PHP версии 4.0 существовала только одна математическая константа, описанная в документации — M_PI (значение числа π, представленное в виде числа с плавающей точкой двойной точности). А начиная с версии PHP 4.0.2 было введено много новых констант. Большинство этих новых констант относились к числу π (или к кратным ему значениям), числу e (или к кратным ему значениям), а также к квадратным корням; кроме того, некоторые константы относились к другим типам. Но в следующих выпусках по ряду причин список констант снова сократился до сравнительно небольшого количества заранее заданных математических констант:

Математические константы PHP

Константа Описание
M_PI π
M_PI_2 π / 2
M_PI_4 π / 4
M_1_PI 1 / π
M_2_PI 2 / π
M_2_SQRTPI 2 / sqrt(π)
M_E e
M_SQRT2 sqrt(2)
M_SQRT1_2 1 / sqrt(2)
M_LOG2E log2(e)
M_LOG10E lg(e)
M_LN2 loge(2)
M_LN10 loge(10)

Проверка формата чисел

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

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

С помощью функций is_int() и is_float можно определить является ли число целым или дробным. Еще две проверки являются немного более сложными: функции is_finite() и is_infinite() позволяют выполнить именно те проверки, на которые указывают их имена (является ли число конечным или бесконечным). Но, строго говоря, диапазон значений, на которые распространяются эти функции, не может включать актуальной бесконечности (и может ли вообще быть проверено, имеет ли числю бесконечно большое значение?). Вместо этого используются пределы диапазона значений с плавающей точкой, допустимые в конкретной системе.

Ниже показан пример использования этих функций:

Преобразование систем счисления

По умолчанию в языке PHP для прямого и обратного преобразования числовых значений из внешнего представления во внутреннее применяется основание системы счисления 10. Кроме того, можно сообщить интерпретатору PHP, что во внешнем представлении используются восьмеричные числа, заданные по основанию 8 (для этого перед числом необходимо ввести ведущий 0), или шестнадцатеричные числа, заданные по основанию 16 (для этого перед числом необходимо ввести префикс 0x).

Безусловно, после преобразования чисел из внешнего представления во внутреннее они хранятся в памяти в двоичном формате, а все основные арифметические и математические вычисления осуществляются в самой операционной системе по основанию 2. Кроме того, в языке PHP предусмотрен ряд функций для преобразования чисел из одного основания системы счисления в другое. Общие сведения об этих функциях приведены в таблице ниже:

Функции преобразования систем счисления

Функция Описание
BinDec() Принимает единственный строковый параметр, представляющий собой двоичное целое число (число по основанию 2), и возвращает строковое представление этого числа по основанию системы счисления 10
DecBin() Аналогична BinDec(), но преобразует из основания системы счисления 10 в основание системы счисления 2
OctDec() Аналогична BinDec(), но преобразует из основания системы счисления 8 в основание системы счисления 10
DecOct() Аналогична BinDec(), но преобразует из основания системы счисления 10 в основание системы счисления 8
HexDec() Аналогична BinDec(), но преобразует из основания системы счисления 16 в основание системы счисления 10
DecHex() Аналогична BinDec(), но преобразует из основания системы счисления 10 в основание системы счисления 16
base_convert() Принимает строковый параметр (представляющий целое число, которое подлежит преобразованию) и два целочисленных параметра (исходное и желаемое основание). Возвращает строку, представляющую преобразованное число. В этой строке цифры старше, чем 9 (от 10 до 35), представлены символами a-z. И исходное, и желаемые основания должны находиться в пределах 2-36

Все функции преобразования систем счисления являются функциями специального назначения, преобразующими числа из одного конкретного основания в другое. Исключением является функция base_convert(), которая принимает произвольные параметры с обозначением начального и результирующего основания.

Обратите внимание на то, что все функции преобразования систем счисления принимают строковые параметры и возвращают строковые значения, но можно использовать десятичные числовые параметры и полагаться на правильное выполнение преобразования типа интерпретатором PHP. Иными словами, варианты вызова DecBin(«1234») и DecBin(1234) приводят к получению одинакового результата.

Экспоненты и логарифмы

Язык PHP включает стандартные экспоненциальные и логарифмические функции двух разноввдностей — для работы по основанию 10 и основанию е (которые приведены в таблице).

Экспоненциальные функции

Функция Описание
pow() Принимает два числовых параметра и возвращает первый параметр, возведенный в степень, равную второму параметру. Значение выражения pow($х, $у) равно xy
exp() Принимает единственный параметр и возводит число e в степень, равную этому показателю степени. Значение выражения exp($х) равно ex
log() Функция натурального логарифма (ln). Принимает единственный параметр и возвращает его логарифм по основанию e
log10() Принимает единственный параметр и возвращает его десятичный логарифм (lg)


В языке PHP предусмотрена функция exp() для возведения числа e в указанную степень, но отсутствует функция с одним параметром, с помощью которой можно было бы возвести в указанную степень число 10. Однако вместо этой функции можно использовать функцию pow() с двумя параметрами, задавая 10 в качестве первого параметра.

Можно убедиться в том, что экспоненциальные и логарифмические функции с одним и тем же основанием являются обратными по отношению друг к другу, проведя проверку идентичности полученных результатов таким образом:

Тригонометрические функции

В языке PHP предусмотрен стандартный набор основных тригонометрических функций, общие сведения о которых приведены в таблице:

Тригонометрические функции

Функция Описание
pi() Не принимает параметров и возвращает приближенное значение числа π (3.1415926535898). Может использоваться как взаимозаменяемая с константой M_PI
sin() Принимает числовой параметр в радианах и возвращает синус параметра в виде числа с плавающей точкой двойной точности
cos() Принимает числовой параметр в радианах и возвращает косинус параметра в виде числа с плавающей точкой двойной точности
tan() Принимает числовой параметр в радианах и возвращает тангенс параметра в виде числа с плавающей точкой двойной точности
asin() Принимает числовой параметр и возвращает арксинус параметра в радианах. Входные данные должны находиться в пределах от -1 до 1 (получение функцией входных данных, выходящих за пределы этого диапазона, приводит к получению результата NAN). Результаты находятся в диапазоне от -π/2 до π/2
acos() Принимает числовой параметр и возвращает арккосинус параметра в радианах. Входные данные должны находиться в пределах от -1 до 1 (получение функцией входных данных, выходящих за пределы этого диапазона, приводит к получению результата NAN. Результаты находятся в диапазоне от 0 до π
atan() Принимает числовой параметр и возвращает арктангенс параметра в радианах. Результаты находятся в диапазоне от -π/2 до π/2

Ниже показан пример составления таблицы вычисления тригонометрических функций для «стандартных» углов:

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

Вычисление с произвольной точностью (с использованием функций BC)

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

Безусловно, точные диапазоны значений данных этих типов могут зависеть от архитектуры серверного компьютера, но значения целых чисел обычно могут находиться в пределах от -231-1 до 231-1, а числа с плавающей точкой двойной точности могут представлять числа с точностью примерно от 13 до 14 десятичных цифр. С другой стороны, для решения задач, требующих использования более широкого диапазона представления или большей точности, в языке PHP предусмотрены математические функции с произвольной точностью (называемые также функциями BC — по имени вычислительной утилиты с произвольной точностью, основанной на средствах системы Unix).

Может оказаться, что функции с произвольной точностью не включены в компиляцию интерпретатора PHP, особенно если пользователь проводил такую компиляцию самостоятельно, поскольку для этого пользователь должен был знать, что на этапе настройки конфигурации необходимо включить в состав параметров флажок —enable-bcmath. Чтобы проверить, имеется ли доступ к указанным функциям, попытайтесь вычислить выражение bcadd(«1″,»1»). Если будет получено сообщение об ошибке, в котором говорится о неопределенной функции, то вам потребуется снова настроить конфигурацию и перекомпилировать интерпретатор PHP.

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

Математические функции с произвольной точностью (функции BC)

Функция Описание
bcadd() Принимает два строковых параметра, представляющих числа, и необязательный целочисленный параметр с обозначением масштабного множителя. Возвращает сумму первых двух параметров в виде строки, с количеством десятичных позиций в результате, определяемом параметром с обозначением масштабного множителя. Если параметр с обозначением масштабного множителя не задан, то используется заданный по умолчанию масштабный множитель
bcsub() Аналогична bcadd(), за исключением того, что возвращает результат вычитания второго параметра от первого
bcmui() Аналогична bcadd(), за исключением того, что возвращает результат умножения своих параметров
bcdiv() Аналогична bcadd(), за исключением того, что возвращает результат деления первого параметра на второй
bcmod() Возвращает модуль (остаток) от деления первого параметра на второй. Поскольку возвращаемое значение относится к целочисленному типу, функция не принимает параметр с обозначением масштабного множителя
bcpow() Возводит первый параметр в степень, указанную вторым параметром. Количество десятичных позиций в результате определяется масштабным множителем, если он задан
bcsqrt() Возвращает квадратный корень параметра с количеством десятичных позиций, которое определяется значением необязательного масштабного множителя
bcscale() Устанавливает заданный по умолчанию масштабный множитель для последующих вызовов функции BC

Большинство из этих функций принимают в качестве последнего параметра необязательный масштабный множитель (целое число), который определяет, какое количество десятичных позиции должно быть в результате. Если такой параметр не задан, то в качестве масштабного множителя используется заданный по умолчанию масштабный множитель, который, в свою очередь, может быть установлен путем вызова функции bcscale(). Заданная по умолчанию величина для этого заданного по умолчанию значения (т.е. величина, которая используется, если в сценарии не применяется вызов функции bcscale()) может быть также задана в файле инициализации php.ini.

Ниже приведен пример использования функции с произвольной точностью для точного выполнения целочисленных арифметических операций. Выполнение следующего кода:

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

Быстрые логарифмы произвольной точности с bcmath

Вот что у меня есть

Но для запуска bcln(100) требуется 5,7 секунды (натуральный логарифм 100, 10 десятичных знаков). Кроме того, это не всегда точно для более десятичных знаков. Есть ли лучший алгоритм?

Для этого конкретного прогона требуется 573 итерации, чтобы рассчитать результат.

1 ответ

Вам нужна строка произвольной длины в качестве ответа? Или вам нужна произвольная точность или произвольный размер экспоненты? Или . будет ли достаточно ответа с плавающей точкой двойной точности (возвращаемого значения); учитывая, что мы «только» работаем с логарифмом числа » произвольного » размера?

Числа с плавающей запятой двойной точности имеют 11-битный показатель степени со знаком: поэтому, если ваша строка больших чисел имеет длину ≤1022 битов ≈ 307 десятичных цифр (поэтому длина строки 306 символов, включая десятичную точку), вы в безопасности! Точнее, вы должны быть в безопасности, если абсолютное значение полученного десятичного показателя составляет ≤307. Вам нужны большие показатели, чем это? (Я полагаю, другими словами: вы работаете с реальными числами или теоретической / чистой математикой?)

Почему бы просто не использовать некоторую обработку строк, а также простую арифметику с плавающей запятой? Это должно быть очень быстро для любых реальных чисел .

Вы можете преобразовать базу, используя известную логарифмическую арифметику:

Я проверил эти функции, и они работают для меня, для примеров, которые я представил; дает точно такие же ответы, как калькулятор Windows 10, вплоть до пределов арифметики двойной точности, используемой PHP.

Если вам действительно нужно более 15 цифр точности и более 307 для десятичной экспоненты, вы можете реализовать свой собственный объект класса «BigFloat» и каким-то образом построить его методы из стандартных встроенных функций с плавающей запятой, используя подход «разделяй и властвуй»! Тогда, возможно, мы могли бы использовать это в качестве основы алгоритма логарифма с плавающей точкой произвольной точности, комбинируя это с функциями / методами, описанными выше. Возможно, вы захотите проконсультироваться с людьми на math.stackexchange.com , чтобы узнать больше о том, может ли это быть осуществимым подходом.

ОСНОВНОЕ РЕДАКТИРОВАНИЕ: 2-я попытка .

Математические функции bcmath произвольной точности

Данные BC функции задействованы только при условии что PHP был скомпилирован в режиме —enable-bcmath, т.е. при включенных в конфигурацию bcmath функциях.

bcadd — Сложение двух чисел произвольной точности.

string bcadd(string левый операнд, string правый операнд, int [ масштаб ]);

Прибавляет левый операнд к правому операнду и возвращает сумму типа string (строковая переменная). Факультативный параметр масштаб используется чтобы установить количество разрядов после десятичной отметки в результате.

Смотрите также bcsub().

bccomp — Сравнение двух чисел произвольной точности.

int bccomp (string левый операнд, string правый операнд, int [ масштаб ]);


Сравнивает левый операнд с правым операндом и возвращает результат типа integer (целое). Факультативный параметр масштаб используется для установки количества цифр после десятичной отметки, используемых при сравнении. При равенстве двух операндов возвращается значение 0. Если левый операнд больше правого операнда возврашается +1, и если левый операнд меньше правого операнда возвращается -1.

bcdiv — Операция деления для двух чисел произвольной точности.

string bcdiv (string левый операнд, string правый операнд, int [ масштаб ]);

Делит левый операнд на правый операнд и возвращает результат. Факультативный параметр масштаб устанавливает количество цифр после десятичной отметки в результате.

Смотрите также bcmul().

bcmod — Получение модуля числа произвольной точности.

string bcmod (string левый операнд, string модуль);

Получение модуля левого операнда используя операнд модуль .

Смотрите также bcdiv().

bcmul — Операция умножения для двух чисел произвольной точности.

string bcmul (string левый операнд, string правый операнд, int [ масштаб ]);

Умножает левый операнд на правый операнд и возвращает результат. Факультативный параметр масштаб устанавливает количество цифр после десятичной отметки в результате.

Смотрите также bcdiv().

bcpow — Возведение одного числа произвольной точности в степень другого.

string bcpow (string x, string y, int [ масштаб ]);

Возведение x в степень y . Параметр масштаб может использоваться для установки количества цифр после десятичной отметки в результате.

Смотрите также bcsqrt().

bcscale — Устанавливает масштаб по умолчанию для всех математических BC-функций

string bcscale (int масштаб);

Эта функция устанавливает заданный по умолчанию параметр масштаба для всех последующих математических BC-функций, которые явно не определяют параметр масштаба.

bcsqrt — Получение квадратного корня числа произвольной точности.

string bcsqrt (string операнд, int масштаб);

Возвращает кваддратный корень операнда . Факультативный параметр масштаб устанавливает количество цифр после десятичной отметки в результате.

Смотрите также bcpow().

bcsub — Вычитает одно число произвольной точности из другого.

string bcsub (string левый операнд, string правый операнд, int [ масштаб ]);

Вычитает правый операнд из левого операнда и возвращает результат типа string. Факультативный параметр масштаб устанавливает количество цифр после десятичной отметки в результате.

Быстрые логарифмы произвольной точности с bcmath

Вот что у меня есть

Но для запуска bcln(100) требуется 5,7 секунды (натуральный логарифм 100, 10 десятичных знаков). Кроме того, это не всегда точно для более десятичных знаков. Есть ли лучший алгоритм?

Для этого конкретного прогона требуется 573 итерации, чтобы рассчитать результат.

1 ответ

Вам нужна строка произвольной длины в качестве ответа? Или вам нужна произвольная точность или произвольный размер экспоненты? Или . будет ли достаточно ответа с плавающей точкой двойной точности (возвращаемого значения); учитывая, что мы «только» работаем с логарифмом числа » произвольного » размера?

Числа с плавающей запятой двойной точности имеют 11-битный показатель степени со знаком: поэтому, если ваша строка больших чисел имеет длину ≤1022 битов ≈ 307 десятичных цифр (поэтому длина строки 306 символов, включая десятичную точку), вы в безопасности! Точнее, вы должны быть в безопасности, если абсолютное значение полученного десятичного показателя составляет ≤307. Вам нужны большие показатели, чем это? (Я полагаю, другими словами: вы работаете с реальными числами или теоретической / чистой математикой?)

Почему бы просто не использовать некоторую обработку строк, а также простую арифметику с плавающей запятой? Это должно быть очень быстро для любых реальных чисел .

Вы можете преобразовать базу, используя известную логарифмическую арифметику:

Я проверил эти функции, и они работают для меня, для примеров, которые я представил; дает точно такие же ответы, как калькулятор Windows 10, вплоть до пределов арифметики двойной точности, используемой PHP.

Если вам действительно нужно более 15 цифр точности и более 307 для десятичной экспоненты, вы можете реализовать свой собственный объект класса «BigFloat» и каким-то образом построить его методы из стандартных встроенных функций с плавающей запятой, используя подход «разделяй и властвуй»! Тогда, возможно, мы могли бы использовать это в качестве основы алгоритма логарифма с плавающей точкой произвольной точности, комбинируя это с функциями / методами, описанными выше. Возможно, вы захотите проконсультироваться с людьми на math.stackexchange.com , чтобы узнать больше о том, может ли это быть осуществимым подходом.

ОСНОВНОЕ РЕДАКТИРОВАНИЕ: 2-я попытка .

Илон Маск рекомендует:  Что такое код split
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL