В этом уроке я познакомлю читателей с математическими функциями, которые имеются в PHP. Точнее, в примерах использоваться будут лишь самые частые из них, так как полный список проще всего найти на официальном сайте, вместе с подробными описаниями. Цель данного урока - скорее не представить полный список этих функций, а привести некоторые примеры их использования. Математические функции предназначены для работы переменными численных типов. Это значит, что операндами будут являться переменные типа int и float. Я разделю эти функции на несколько типов: 0. Общие функции 1. Тригонометрические функции 2. Обратные тригонометрические функции 3. Логарифмические функции 4. Степенные функции 5. Функции преобразования оснований исчисления 6. Остальные (которые трудно классифицировать) Общие функции К общим функциям я отнес функции: abs floor ceil max min round rand sqrt Опишу их более подробно. abs Cинтаксис: number abs ( mixed number ) Функция вычисляет модуль числа. Напомню, что |x|=x, если x>0 или x=0, и |x|=-x, если x<0. floor Cинтаксис: float floor ( float value) Эта функция округляет дробь в меньшую сторону. Но не стоит думать, что это - "отбрасывание" дробной части. Потому что, во-первых, результат все равно будет не целочисленным, а вещественным. К тому же для отрицательных чисел ближайшим меньшим целым числом будет дробь, дополненная до него. ceil Cинтаксис: float ceil ( float value ) Эта функция также округляет аргумент до ближайшего целого, но уже до ближайшего большего целого. Функции floor и ceil возвращают вещественный результат по одной простой причине - диапазон вещественных чисел в PHP больше, чем целых. max Cинтаксис: mixed max ( number arg1, number arg2 [, number ...] ) mixed max ( array numbers ) Эта функция имеет 2 описания синтаксиса. Она возвращает максимальное значение среди аргументов, если они переданы в виде полного списка (1-й вариант синтаксиса), или же наибольший элемент массива, в случае, если был передан массив (2-й вариант синтаксиса). Любопытно вот что: аргументы могут быть разных типов. Скажем, <?PHP $test = max('строка', array(0, 1), 4, 7); //вернется array(0, 1) - массив всегда будет считаться больше остального, хотя такое "сравнение" выглядит довольно глупо ?> Я не могу представить, зачем такое может потребоваться, но тем не менее, в PHP это работает именно так. Полностью аналогичная функция min, её можно даже не описывать. Разница в том, что возвращается минимум. round Cинтаксис: float round ( float val [, int precision] ) Округляет вещественное число по арифметическим правилам. Можно указать точность округления. В этом случае будет вестись округление до указанного числа знаков дроби. Эту точность можно указать равной 0 (равносильно вызову функции без указания точности). Кроме этого, можно указать и отрицательное значение точности. Результат аналогичен. rand Cинтаксис: int rand ( [int min, int max] ) Возвращает случайное целое число в диапазоне от min до max включительно. Эти параметры не обязательны. Если их не указывать, вернется случайное число в диапазоне от 0 до константы RAND_MAX. На операционных системах семейства Windows значение RAND_MAX всего лишь 32767 Если нужно случайное дробное число, то можно воспользоваться, например, таким кодом: <?PHP //Генерируем случайное вещественное число в диапазоне $a..$b в предположении $a<$b $iMaxRand=30000;//по сути, можно задавать и больше для большей точности $iRand=rand(1, $iMaxRand); $fRand=$a+($b-$a)*$iRand/$iMaxRand; ?> sqrt Cинтаксис: float sqrt (float arg) Функция вычисляет квадратный корень аргумента. И аргумент и результат - вещественные. Тригонометрические и обратные тригонометрические функции К тригонометрическим функциям я отнес функции: acos acosh asin asinh atan2 atan atanh cos cosh sin sinh tan tanh Все эти функции принимают в качестве аргумента параметры типа float, и возвращают значение этого же типа. По той причине, что для их описания требуется лишь знание, что конкретно каждая из них делает, не буду приводить здесь все описания. (А назначение этих функций известно из геометрии и алгебры). acos Cинтаксис: float acos(float arg) Вычисляет арккосинус числа. В случае, если аргумент недопустим (то есть |arg|>1), возвращает NAN. Логарифмические функции К логарифмическим функциям я отнес функции: log10 log1p log Эти функции также не требуют отдельного описания. Отдельно скажу лишь о функции log1p. Дело в том, что, в силу особенности самого логарифма, при значениях аргумента, близкого к 1, он сильно стремится к нулю. Это может быть помехой для "тонких" вычислениях. Эта функция вычисляет значение более точным способом. Кроме прочего, приведу пример полезной функции, которая вычисляет логарифм по произвольному основанию: <?PHP function Log($base, $arg) { if($base==1||$base<=0) { return null; } if($arg<=0) { return null; } return log($arg)/log($base); } ?> Да, кстати, вопрос для читателей - я назвал функцию Log - не вызовет ли это конфликта с именем уже существующей функции log? Степенные функции Перейдем к степенным функциям: exp expm1 pow Аналогично логарифмам, отдельно следует обратить внимание лишь на expm1, возвращающую точно вычисленную степень агрумента, близкого к 0.
Функции преобразования оснований исчисления В php есть специяльный ряд функций, которфе работают с преобразованием систем счисления. Если учесть, что bin - двоичная система, oct - восмеричная, dec - десятичная, а hex - шестнадцатиричная, то назначение многих из них становится интуитивно понятным: base_convert bindec decbin dechex decoct hexdec octdec Интерес же представляет функция base_convert: base_convert Cинтаксис: string base_convert ( string number, int frombase, int tobase) Возвращает строку, содержащую число number, представленное с базой tobase.База, в которой number даётся, специфицируется в frombase. И frombase, и tobase должны быть в диапазоне от 2 до 36 включительно. Почему такое ограничение? Да потому, что цифры, большие 10, записываются при помощи символов латинского алфавита. То есть от a до z. Вместе с первыми 9-ю основаниями выйдет как раз 35 возможных значений. Неклассифицированные функции В заключение приведу ряд полезных, не классифицированных мною отдельно, функций: is_finite is_infinite is_nan is_finite Cинтаксис: bool is_finite (float val) Эта функция определяет, конечно ли число с точки зрения диапазона чисел с плавающей точкой. Этот диапазон берется исходя из т екущей платформы. is_finite Cинтаксис: bool is_infinite (float val) Эта функция определяет, бесконечно ли число с точки зрения диапазона чисел с плавающей точкой. При этом, конечно, учитываются возможности платформы, но, скажем, результат log(0) не будет таковым ни на какой платформе (можете подумать, почему) is_nan Cинтаксис: bool is_nan (float val) Показывает, является ли аргумент действительным числом. С точки зрения алгебры, в категорию не вещественных чисел попадут как не-числа совсем (вроде арккосинуса от двойки), так и комплексные числа (вроде квадратного корня из -1). В обоих случаях функция вернет false. В конце урока, как обычно, приведу ряд вопросов. 1. Что вернет функция is_nan, если переданный ей аргумент - трансцендентное число с точки зрения алгебры? 2. Пусть у нас обозначаются 1-9 обычный цифры, a-z цифры от 10 до 35, и A-Z цифры от 36 до 62. Напишите функцию, которая бы конвертировала число из одной системы счисления в другую (как base_convert), но с учетом таких обозначений (то есть аргумент принимает значение от 2 до 62) 3. В чем разница между is_nan и is_finite? Приведите примеры, когда их значения от одного и того же агрумента различны. Ответы на эти вопросы вы найдете здесь: здесь
|