Скачиваний:
18
Добавлен:
02.05.2014
Размер:
906.24 Кб
Скачать

10. Математические функции

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

Встроенные константы

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

Таблица 2. Математические константы.

Константа

Величина

Пояснение

M_PI

3,14159265358979323846

Число π

M_E

2,7182818284590452354

Е

M_LOG2E

1,4426950408889634074

Log2(e)

M_LOG10E

0,43429448190325182765

Lg(e)

M_LN2

0,69314718055994530942

Ln(2)

M_LN10

2,30258509299404568402

Ln(10)

M_PI_2

1,57079632679489661923

π /2

M_PI_4

0,78539816339744830962

π /4

M_1_PI

0,31830988618379067154

1/π

M_2_PI

0,63661977236758134308

2/π

M_SQRTPI

1,77245385090551602729

sqrt(π)

M_2_SQRTPI

1,12837916709551257390

2/sqrt(π)

M_SQRT2

1,41421356237309504880

sqrt(2)

M_SQRT3

1,73205080756887729352

sqrt(3)

M_SQRT1_2

0,70710678118654752440

1/sqrt(2)

M_LNPI

1,14472988584940017414

Ln(π)

M_EULER

0,57721566490153286061

Постоянная Эйлера

Надо заметить, разработчики PHP что-то слишком разошлись, когда вводили стандартные константы. Например, я не могу даже и представить, зачем в Web-программировании может потребоваться, например, константа Эйлера. Что же, это их право….

Функции округления

mixed abs(mixed $number)

Возвращает модуль числа. Тип параметра $number может быть float или int, а тип возвращаемого значения всегда совпадает с типом этого параметра.

double round(double $val)

Округляет $val до ближайшего целого и возвращает результат, например:

$foo = round(3.4); // $foo == 3.0

$foo = round(3.5); // $foo == 4.0

$foo = round(3.6); // $foo == 4.0

int ceil(float $number)

Возвращает наименьшее целое число, не меньшее $number. Разумеется, передавать в $number целое число бессмысленно.

int floor(float $number)

Возвращает максимальное целое число, не превосходящее $number.

Случайные числа

Следующие три функции предназначены для генерации случайных чисел. Пожалуй, в Web-программировании самое распространенное применение они находят в сценариях показа баннеров.

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

int mt_rand(int $min=0, int $max=RAND_MAX)

Функция возвращает случайное число, достаточно равномерно даже для того, чтобы использовать ее в криптографии. Если вы хотите генерировать числа не от 0 до RAND_MAX (эта константа задает максимально допустимое случайное число, и ее можно получить при помощи вызова mt_getrandmax()), задайте соответствующий интервал в параметрах $min и $max. Не забудьте только перед первым вызовом этой функции запустить mt_srand(). Давайте теперь рассмотрим один из случаев применения функции mt_rand(). Речь пойдет об извлечении строки со случайным номером из текстового файла (работу с файлами мы рассмотрим чуть позже, а пока скажу лишь, что функция fget() читает очередную строку из файла, дескриптор которого указан ей в первом параметре, а второй параметр задает максимально возможную длину этой строки, для нас это – очень большое число). Поступим так:

for($i=0; mt_rand(0,$i)<1; $i++)

$s=fgets($OurFile,10000);

echo "Случайная строка: $s";

Этот способ работает в строгом соответствии с теорией вероятностей: для первой строки вероятность ее извлечения будет 100%, для второй – 50% (она перепишется поверх первой), для третьей – 33%, и т. д. Например, если файл состоит всего из трех строк, то вероятность извлечения третьей строки, как мы уже заметили, будет равна 33%, а значит, первой или второй – соответственно, 66%. Но вероятность извлечения второй строки после первой равна 50%, а 50% от 66% будет также 33%, т. е. вероятность извлечения каждой строки одинакова. Мы видим, что для файла из трех строк алгоритм работает правильно. Не вдаваясь в математические подробности, скажу, что он работает верно и для любого количества строк. Безусловно, мы могли бы загрузить весь файл в память и выбрать из него нужную строку и при помощи одного-единственного вызова mt_rand(), но если файл содержит очень много данных, это может быть довольно не экономично с точки зрения расхода памяти. Наоборот, для случая коротких файлов способ единовременной загрузки предпочтительнее. Насколько коротких? Думаю, это легче всего определить опытным путем. Рассмотренный нами способ решает проблему с большими файлами.

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

Voidmt_srand(int$seed) – Настраивает генератор случайных чисел на новую последовательность. Дело в том, что хотя числа, генерируемые mt_rand(), достаточно равновероятны, но у них есть один недостаток (который, как это обычно бывает, иногда перерастает в достоинство): последовательность сгенерированных чисел будет одинакова, если сценарий вызвать несколько раз подряд. Функция mt_srand() как раз решает данную проблему: она выбирает новую последовательность на основе параметра $seed, причем практически непредсказуемым образом. Чаще всего ее инициализируют так:

mt_srand(time()+(double)microtime()*1000000);

$randval = mt_rand();

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

int mt_getrandmax() – Возвращает максимальное число, которое может быть сгенерировано функцией mt_rand() – иными словами, константу RAND_MAX.

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

stringbase_convert(string$number,int$frombase,int$tobase) – Переводит число $number (заданное как строка в системе счисления по основанию $frombase) в систему по основанию $tobase. Параметры $frombase и $tobase могут принимать значения только от 2 до 36 включительно. В строке $number цифры обозначают сами себя, буква a соответствует 11, b – 12, и т. д. до z, которая обозначает 36. Например, следующие команды выведут 11111111 (8 единичек), потому что это не что иное, как представление шестнадцатеричного числа FF в двоичной системе счисления:

echo base_convert("FF",16,2);

intbindec(string$binary_string) – Преобразует двоичное число, заданное в строке $binary_stringв десятичное число.

stringdecbin(int$number) –Возвращает строку, представляющую собой двоичное представление целого числа $number. Максимальное число, которое еще может быть преобразовано, равно 2 147 483 647, которое выглядит как 31 единичка в двоичной системе.

Существуют аналогичные функции для восьмеричной и шестнадцатеричной систем. Называются они так же, только вместо "bin" подставляется соответственно "oct" и "hex".

Минимум и максимум mixed min(mixed $arg1 [int $arg2, ..., int $argn])

Эта функция возвращает наименьшее из чисел, заданных в ее аргументах. Различают два способа вызова этой функции: с одним параметром или с несколькими. Если указан лишь один параметр (первый), то он обязательно должен быть массивом и возвращается минимальный элемент этого массива. В противном случае первый (и остальные) аргументы трактуются как числа с плавающей точкой, они сравниваются, и возвращается наименьшее. Тип возвращаемого значения выбирается так: если хотя бы одно из чисел, переданных на вход, задано в формате с плавающей точкой, то и результат будет с плавающей точкой, в противном случае результат будет целым числом. Обратите внимание на то, что с помощью этой функции нельзя лексикографически сравнивать строки – только числа.

mixedmax(mixed$arg1 [int$arg2, ...,int$argn]) – Функция работает аналогично min(), только ищет максимальное значение.

Степенные функции float sqrt(float $arg)

Возвращает квадратный корень из аргумента. Если аргумент отрицателен, то генерируется предупреждение, но работа программы не прекращается! Это выглядит довольно странно: интересно, что в этом случае возвращается функцией?..

float log(float $arg) – Возвращает натуральный логарифм аргумента. В случае недопустимого числа печатает предупреждение, но, как и sqrt(), не завершает программу.

float exp(float $arg) – Возвращает e (2,718281828…) в степени $arg.

float pow(float $base, float $exp) – Возвращает $base в степени $exp.

Тригонометрия

Далее рассмотрим тригонометрические функции. Правда, они редко применяются при программировании сценариев, но все же...

float acos(float $arg) – Возвращает арккосинус аргумента.

float asin(float $arg) – Возвращает арксинус.

float atan(float $arg) – Возвращает арктангенс аргумента.

floatatan2(float$y,float$x) – Возвращает арктангенс величины $y/$x, но с учетом той четверти, в которой лежит точка ($x, $y). Эта функция возвращает результат в радианах, принадлежащий отрезку от ? до ?. Вот пара примеров:

$alpha=atan2(1,1); // $alpha==pi/4

$alpha=atan2(-1,-1); // $alpha==-3*pi/4

float sin(float arg) – Возвращает синус аргумента. Аргумент задается в радианах.

float cos(float $arg) – Возвращает косинус аргумента.

float tan(float arg) – Возвращает тангенс аргумента, заданного в радианах.

double pi() Возвращает число π. Эту функцию в PHP версии 4 обязательно нужно вызывать с парой пустых скобок (в отличие от PHP 3):

echo pi()*10;

Впрочем, наверное, лучше будет воспользоваться константой M_PI.