Математические функции в PowerShell

Математические функции в PowerShell

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

А вот для более сложных математических операций придется задействовать статический класс [math]. В этот класс входит около 30 свойств и методов, с помощью которых можно производить различные математические действия. Для начала выведем эти методы командой:

[math] | Get-Member -Static

Ну а теперь рассмотрим их все по порядку.

Константы

Начнем с двух свойств, E и PI. Как вы наверное догадались, это математические константы. PI равно отношению длины окружности к длине её диаметра, E — основание натурального логарифма. Вывести их значение можно командой:

Степени, корни и логарифмы

Переходим к методам. Метод ::Pow(x,y) возводит число х в степень у, например:

[math]::Pow(3,2) возвращает 9

Метод ::Sqrt(x) вычисляет квадратный корень из числа x, например:

[math]::Sqrt(9) возвращает 3

Метод ::Exp(x) служит только для одного — возведения в степень x числа E. Например так возведем E в квадрат:

Продолжая тему числа E, рассмотрим еще парочку методов. Метод ::Log(x) вычисляет натуральный логарифм числа x (логарифм с основанием e), а метод ::Log10(x) — десятичный логарифм (логарифм с основанием 10). Например:

Округление

Округление — довольно часто встречающаяся операция. Метод ::Round(x,y) округляет число x, а y задает нужное количество знаков после запятой. Например:

[math]::Round(1234.5678, 2) возвращает 1234.57 [math]::Round(1234.5678, 0) возвращает 1235

Обратите внимание на правила округления:

[math]::Round(12.345, 2) возвращает 12.34 [math]::Round(12.346, 2) возвращает 12.35

Метод ::Truncate(x) также можно использовать для округления числа x, однако в отличие от предыдущего метода округление производится очень грубо — путем отбрасывания всех знаков после запятой. Например:

[math]::Truncate(1.2) возвращает 1 [math]::Truncate(1.8) возвращает 1 [math]::Truncate(-1.2) возвращает -1 [math]::Truncate(-1.8) возвращает -1

И еще два метода округления. Метод ::Ceiling(x) округляет число х в большую сторону до ближайшего целого значения. Например:

[math]::Ceiling(1.2) возвращает 2 [math]::Ceiling(1.8) возвращает 2 [math]::Ceiling(-1.2) возвращает -1 [math]::Ceiling(-1.8) возвращает -1

Метод ::Floor(x) также округляет число до ближайшего целого значения, но в меньшую сторону. Например:

[math]::Floor(1.2) возвращает 1 [math]::Floor(1.8) возвращает 1 [math]::Floor(-1.2) возвращает -2 [math]::Floor(-1.8) возвращает -2

Сравнение

Есть в классе [math] пара методов для сравнения. К примеру метод ::Min(x,y) возвращает наименьшее, а метод ::Max(x,y) — наибольшее из двух чисел:

[math]::Min(1,2) возвращает 1 [math]::Max(1,2) возвращает 2 [math]::Min(1,-2) возвращает -2

А метод ::Equals(x,y) сравнивает числа х и y и возвращает True, если числа ровны и False, если не ровны. Например:

[math]::Equals(1,2) возвращает False [math]::Equals(2,2) возвращает True

Важно помнить, что для сравнения x и у должны иметь один тип данных. К примерк, для оператора Equals 2 (int32) не равно 2.0 (double) или ″2″ (string):

[math]::Equals(2,2.0) возвращает False [math]::Equals(2,″2″) возвращает False

Абсолютное значение и знак числа

Метод ::Abs(x) возвращает абсолютное значение числа х, т.е. значение без учета знака. Например:

[math]::Abs(10) возвращает 10 [math]::Abs(-10) возвращает 10

Метод ::Sign(x) возвращает значение, определяющее знак числа х — 1 если число положительное, -1 если число отрицательное и 0, если x равен 0. Например:

[math]::Sign(20) возвращает 1 [math]::Sign(0) возвращает 0 [math]::Sign(-10) возвращает -1

В качестве x можно передавать не только отдельные числа, но и выражения:

[math]::Sign(10-15) возвращает -1 [math]::Sign(-1*2+2) возвращает 0

Разное

Теперь рассмотрим некоторые специфические функции, которые скорее всего вам никогда не понадобятся 🙂

Функция ::IEEERemainder(x,y) возвращает остаток от деления X / Y, однако делает это несколько необычным образом. Так при делении X / Y остаток вычисляется по формуле X — (Y * Q), где Q является частным от деления X / Y, округленным до ближайшего целого числа. Если X / Y находятся на равном расстоянии от двух целых чисел, то выбирается четное. Поскольку значение Y * Q может быть больше чем X, остаток может принимать как положительные, так и отрицательные значения. Например:

[math]::IEEERemainder(19,6) возвращает 1 [math]::IEEERemainder(18,6) возвращает 0 [math]::IEEERemainder(17,6) возвращает -1

Другими словами, IEEERemainder возвращает минимальное число, которое необходимо добавит или вычесть из делимого X, чтобы сделать его кратным делителю Y.

Метод ::BigMul предназначен для умножения двух 32-битных чисел. Результат умножения возвращается в виде 64-битного числа. Использовать этот метод стоит в том случае, если для результата вам не хватает 32-битов.

Метод ::DivRem(x,y,[ref]$R) вычисляет результат деления X/Y и возвращает остаток от деления в выходном параметре ($R). Обратите внимание, что переменная $R должна быть определена заранее:

$R = 0 [math]::DivRem(20,3,[ref]$R) возвращает частное 6 $R возвращает остаток от деления 2

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

Ну и в завершение тригонометрические функции. Наврядли вы будете использовать их в своих скриптах, поэтому привожу их исключительно для общего развития. Напомню, что по умолчанию эти функции вычисляются в радианах, поэтому для перевода в градусы необходимо использовать конструкцию (x/180*Pi). Например вычислим синус 90º:

$Pi = [math]::PI [math]::Sin(90/180 * $Pi)

или тангенс 45º:

Обратные тригонометрические функции. Они также вычисляются в радианах, для преобразования в градусы результат надо умножить на 180/Pi. Для примера вычислим арксинус 1 (угол, синус которого равен 1):

Ну вот, основные математические функции PowerShell мы рассмотрели. А более подробно познакомится со свойствами и методами класса [math] можно на MSDN.

📎📎📎📎📎📎📎📎📎📎