PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1] 

> Описание: Начало всех наук.
EuGen Администратор
Отправлено: 19 Января, 2009 - 11:41:49
Post Id


Профессионал


Покинул форум
Сообщений всего: 9097
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




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

Математические функции предназначены для работы переменными численных типов. Это значит, что операндами будут являться переменные типа int и float.
Я разделю эти функции на несколько типов:

0. Общие функции
1. Тригонометрические функции
2. Обратные тригонометрические функции
3. Логарифмические функции
4. Степенные функции
5. Функции преобразования оснований исчисления
5. Остальные (которые трудно классифицировать)

К общим функциям я отнес функции:
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:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $test = max('строка', array(0, 1), 4, 7);
  4. //вернется array(0, 1) - массив всегда будет считаться больше остального, хотя такое "сравнение" выглядит довольно глупо
  5. ?>
  6.  

Я не могу представить, зачем такое может потребоваться, но тем не менее, в 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:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. //Генерируем случайное вещественное число в диапазоне $a..$b в предположении $a<$b
  4. $iMaxRand=30000;//по сути, можно задавать и больше для большей точности
  5. $iRand=rand(1, $iMaxRand);
  6. $fRand=$a+($b-$a)*$iRand/$iMaxRand;
  7. ?>
  8.  

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:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. function Log($base, $arg)
  4. {
  5.    if($base==1||$base<=0)
  6.    {
  7.       return null;
  8.    }
  9.    if($arg<=0)
  10.    {
  11.       return null;
  12.    }
  13.    return log($arg)/log($base);
  14. }
  15. ?>
  16.  

Да, кстати, вопрос для читателей - я назвал функцию 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.

В конце урока, как обычно, приведу ряд вопросов.

0. Что вернет функция is_nan, если переданный ей аргумент - трансцендентное число с точки зрения алгебры?
1. Пусть у нас обозначаются 1-9 обычный цифры, a-z цифры от 10 до 35, и A-Z цифры от 36 до 62. Напишите функцию, которая бы конвертировала число из одной системы счисления в другую (как base_convert), но с учетом таких обозначений (то есть аргумент принимает значение от 2 до 62)
2. В чем разница между is_nan и is_finite? Приведите примеры, когда их значения от одного и того же агрумента различны.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Уроки php »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB