Функция Power

Функция Power в Паскале (и многих других языках программирования) выполняет возведение числа в степень.
Синтаксис для вещественных чисел:
function Power(Base: Double; Expon: Double) : Double;
Синтаксис для целых чисел:
function Power(Base: LongInt; Expon: LongInt) : LongInt;
Эта функция возводит число Base в степень Expon и возвращает результат. В реальности функция возвращает результат выражения:
- В документации сказано, что функция объявлена в модуле SYSTEM. Однако без подключения модуля MATH компилятор выдаёт ошибку. Из этого следует, что на самом деле функция объявлена в модуле MATH.
- В документации приведён синтаксис как для целых, так и для вещественных чисел. Однако на самом деле функция работает только с вещественными числами. При попытке использовать целые числа компилятор также выдаёт ошибку.
- Возможно, в более новых версиях эти проблемы уже исправлены. Но у меня было именно так (версия FPC 3.0.0).
Пример использования функции Power
Пример приведён ниже:
program funcpower; uses Math; var x, y, z : single; begin x := 2; y := 3; z := Power(x, y); //Z = X в степени Y WriteLn(z:0:2); ReadLn; end.
Здесь мы число 2 (переменная Х) возводим в степень 3 (переменная Y), то есть вычисляем следующую формулу:
Z = X Y
Обратите внимание на подключенный модуль MATH.
Эта статья входит в раздел о подпрограммах модуля SYSTEM. И по идее описания функции Power здесь не должно быть. Но, так как в документации сказано, что функция Power объявлена в модуле SYSTEM, я решил включить данную статью именно в этот раздел (я же не виноват, что в документации косяк))).
Возведение в степень в Паскале
Возведение в степень в Паскале можно выполнить и без какой-то специальной функции, используя функцию вычисления натурального логарифма и функцию вычисления экспоненты. О том, как это сделать, я рассказал здесь.
Однако, если есть специальная функция для возведения числа в степень, то почему бы ей и не воспользоваться? С одной стороны. С другой стороны — эта функция совершенно неожиданно требует подключения модуля MATH.
В документации сказано, что по сути функция Power работает по формуле возведения в степень в Паскале:
Однако, если мы будем делать именно так, эта формула будет неправильно работать с отрицательными числами, потому что в документации сказано, что функция Ln работает только с положительными числами.
Так что функция Power в реальности несколько сложнее, чем приведённая выше формула.
Поэтому для разминки мы напишем свой аналог функции Power, который будет работать правильно. Но для начала вспомним как вычисляется степень числа:

Также напомню, что любое число в нулевой степени равно 1, а ноль в любой степени равен 0 (кроме нуля в нулевой — ноль в нулевой степени не определён, но мы будем возвращать в таких случаях ноль, хотя функция Power возвращает 1).
А теперь наш аналог функции Power:
function AVPower(Base: Double; Expon: Double) : Double; var m : byte; i : integer; Res : Double; begin m := 0; if Expon < 0 then m := 1 //Отрицательная степень else if Expon = 0 then m := 2 //Нулевая степень else m := 3; //Положительная степень if Base < 0 then m := 10 + m //Отрицательное число else if Base = 0 then m := 20 + m //Число равно 0 else m := 30 + m; //Положительное число case m of 11 : //Отрицательное число, отрицательная степень begin //Если Expon - не целое число, то получаются комплексные числа Res := 1 / Exp(Abs(Expon) * Ln(Abs(Base))); i := Round(Expon); if Odd(i) then Res := -1 * Res; end; 12, 32 : //Нулевая степень Res := 1; 13 : //Отрицательное число, положительная степень begin //Если Expon - не целое число, то получаются комплексные числа Res := Exp(Expon * Ln(Abs(Base))); i := Round(Expon); if Odd(i) then Res := -1 * Res; end; 21..23 : //Число равно нулю Res := 0; 31 : //Положительное число, отрицательная степень Res := 1 / Exp(Abs(Expon) * Ln(Base)); 33 : //Положительное число, положительная степень Res := Exp(Expon * Ln(Base)); end; AVPower := Res; end;
Я сознательно немного всё усложнил, чтобы вас запутать )))
Пример использования функций Power и её аналога в программе:
x := 2; y := 3; z := Power(x, y); //Z = X в степени Y WriteLn(z:0:2); z := AVPower(x, y); //Z = X в степени Y WriteLn(z:0:2);
Здесь есть один подвох - если вы попытаетесь возвести отрицательное число в не целую степень, например, так:
то стандартная функция Power вызовет ошибку во время выполнения программы. В своём аналоге я этого избежал, но надо понимать, что результат в этом случае будет неправильным (хотя с моей точки зрения это всё-равно лучше, чем аварийное завершение программы).
Это происходит потому, что при таком раскладе результатом являются комплексные числа, а операции с комплексными числами выполняются по другим правилам.
В реальных программах подобные ситуации надо дополнительно обрабатывать (хотя бы предупреждать пользователя о том, что при отрицательном основании и не целой степени функция вернёт неправильный результат).
Ещё в моей функции используется функция Odd, о которой я ещё не рассказывал. Вкратце скажу, что она определяет, является ли число чётным. Более подробно о ней расскажу в отдельной статье.
Программирование на языке паскаль
Модуль Math включает дополнительные математические функции. Они доступны после ссылки на модуль в разделе объявлений в строке uses. Ниже приведены некоторые основные операции по категориям.
Геометрические функции
| Вызов | Операция |
| Hypot(x, y) | Гипотенуза треугольника с катетами x, y. |
| Norm(d) | Эвклидова норма массива d. |
Определение максимума/минимума
| Вызов | Описание |
| Max(a, b) | Максимальное целое из a, b. |
| MaxIntValue(d) | Максимальное целое из массива d. |
| MaxValue(d) | Максимальное значение из массива d. |
| Min(a, b) | Минимальное целое из a, b. |
| MinValue(d) | Минимальное значение из массива d. |
Экспоненциальные и логарифмические функции
| Вызов | Описание |
| Power(X, y) | X в степени y. |
| IntPower(X, y) | X в степени целого y. |
| LdExp(X, p) | Функция. |
X в степени 2 в степени p.
Натуральный логарифм от (x+1).
Логарифм x по основанию 10..
Логарифм x по основанию 2..
Логарифм x по основанию N..
Функции преобразования чисел
| Вызов | Операция |
| Ceil(x:float):integer | Функция. Целое x округляется вверх. |
| Floor(x:float):integer | Функция. Целое x округляется вниз. |
| FrExp(x:float; var mant; |
Функции преобразования единиц
Применяются для преобразования единиц измерения углов. Аргумент тригонометрических функций может исчисляться в:
- периодах,
- радианах (1 период = 2π радиан),
- градусах (1 период = 360 градусов),
- градах (1 период = 400 градов, используется в мореходстве).
| Вызов | Операция |
| CycleToRad(x:float):float | Функция. Периоды в радианы. |
| DegToGrad(x:float):float | Функция. Градусы в грады. |
| DegToRad(x:float):float | Функция. Градусы в радианы. |
| GradToRad(x:float):float | Функция. Грады в радианы. |
| GradToDeg(x:float):float | Функция. Грады в градусы. |
| RadToCycle(x:float):float | Функция. Радианы в периоды. |
| RadToDeg(x:float):float | Функция. Радианы в градусы. |
| RadToGrad(x) :float):float | Функция. Радианы в грады. |
Тригонометрические функции
| Вызов | Операция |
| Tan(x: float):float | Функция. Тангенс от x. |
| Cotan(x: float):float |
out s,c: float):float
Гиперболические функции
| Вызов | Операция |
| SinH(x:float):float | Функция. |
Синус гиперболический от x.
Обратный синус гиперболический от x.
Косинус гиперболический от x.
Обратный косинус гиперболический от x.
Тангенс гиперболический от x.
Обратный тангенс гиперболический от x.
Статистические функции
| Вызов | Операция |
| Mean(d:array of extended):float | Функция. |
Среднее значение массива d.
of extended; m,std:float)
(d:array of extended;
Стандартное отклонение массива d.
Квадратный корень дисперсии массива d.
Сумма значений массива d.
Сумма квадратов значений массива d.
of extended;var s,ssqr):float
Power в паскале что это
Анализировал код на Delphi, написанный другим программистом. Встретил там вот такую функцию
FUNCTION STP(x,y:double):double;
begin
stp:=exp(y*ln(x));
end;
но ведь это же просто x^y. Объясните мне, пожалуйста, смысл подобных манипуляций? Так что, быстрее считает? Или в делфях нет родного возведения в степень?
Функция Power
Функция Power в Паскале (и многих других языках программирования) выполняет возведение числа в степень.
..
Эта функция возводит число Base в степень Expon и возвращает результат. В реальности функция возвращает результат выражения:
(0) А какое было условие задачи? Если "написать функцию возведения в степень без использования функции power", то там все правильно сделано. Хотя есть и другие способы, но они более длинные.
(0) Мы не знаем предысторию, может разработчик портировал библиотеку с другого ЯП или, к примеру, Turbo Pascal, где такой функции не было.
(0) скорее всего, код был перетащен из Турбо-Паскаля. А в нем - таки не было. Функция Power появилась в модуле Math, который имелся в Delphi, но отсутствовал в Borland Pascal 7.0 и Turbo Pascal 7.0, поэтому там возводили в степень именно так как написано.
(1) ну, в стандартной библиотеке Си она зовется pow, а в бейсике это вообще оператор. Так что насчет многих вопрос сложный. К сожалению, более-менее стандартного именования для этой функции нет, поэтому каждый раз приходится разыскивать, если не знаешь (в отличие от sin и cos, например).
(5) Ее всего два вида - pow и power, чего там искать?
Ну еще конечно STP - сокращенно от STEPEN, что тоже не нужно искать, и так очевидно что если подчеркнуто красным pow/power, значит юзаем STP.
Помнится,был очень старый Basic для древних компов на 8битном процессоре,так там умножение через сложение логарифмов делали,и утверждалось,что так быстрее.
Дельфи - страна чудес
(0) Операция возведения в степень существенно усложняется когда х и/или y - вещественные числа.Тогда только как в (0).Все функции решающие эту задачу не более чем обертка над (0).
(0)Не знаю как сейчас, но раньше точно такой функции не было x^y. Это стандартный способ возведения в степень, даже если не знать математику, этому учат в школе и институтах.
(0) Хотелось бы узнать, а как еще можно возвести (вещ.) число в вещ. степень?
На заре ВТ были диссертации, как сделать вычисление логарифма побыстрее. То же касается и тригонометрических функций. Кстати, в Turbo Pascal синус вычислялся с точностью только 4 знака после запятой.
Что скрывается за POW или POWER или x^y знает только разработчик.
(12)"Что скрывается за POW или POWER"
это же exp(y*ln(x)); и скрывается
а exp и ln - это не нужно вычислять.
Ну, хорошо, для недалёких, можно пример решить:
вариантами прямого и хитрого возведения?
(14) эти функции вычисляются аппаратно
(0)
>>в делфях нет родного возведения
его нигде нет на данной архитектуре
(15) Я что-то пропустил в своей жизни. Есть схемы, многократно и не на целое число умножающие е - аппаратно, но любую другую цифру аппаратно не умножающие?
(17) там по другому считается. учи матан
(18) Понять бы, куда учить. Несколько лет матан давали, а толку ео применения - так и не увидел. Забыл даже то, что учил.
Что значит "по-другому"? Я понимаю, извернуть прямое умножение формулой, дающей аналогичный результат - это доказуемо, формулу можно упростить до исходной задачи.
Но что есть "по-другому считается возведение в степень числи е"?
(17) Сейчас на уровне АЛУ в ядре шифрование поддерживается - это значит, что реализованы сложные вычисления без использования памяти, все на на регистрах ядра вычисляется.
кстати, в большинстве случаев эти функции неправильно ведут себя при x=y=0
(19) скорее всего через ряды или бесконечную дробь
Помню как умножение на два делается - Битовым сдвигом влево.
(0) для экспоненты и логарифма степенные ряды выглядят проще. поэтому вычисление именно такое.
Новое слово на сегодняшний день - "степенные ряды".
рядами все делается. Что на калькуляторе, что на компе. Другое дело что это внутри проца уже зашито, т.е. аппаратно.
нового ничего с 18 века не придумали, увы
(23)(27) Не уверен: много членов нужно брать, особенно для логарифма. Для и для синуса не уверен, хотя в нем быстросходящийся ряд.
Вот и выяснилось, что тотальное изучения матана в технихических вузах - дибилизм существующей системы образования. А использование для этого ручки, листочка и препода перепачканного мелом, тем более.
(30) Насчет дебилизма не могу согласиться: учиться было интересно, и, надеюсь, ориентируюсь (в матане), хотя прошло 48 лет. Благодаря преподавателю Кутасову Сергею Александровичу.
Не могу сказать, что знания матана активно использовал, но стиль помогал.
(29) там выячислется для х в промежутке (-1; 1)
для остальных уже обработкой
(29) ну а что делать. Если у вас есть только память и четыре арифметических действия, то вариантов-то немного. Вы можете что-то дернуть из заранее занесенной разработчиками в память таблицы; что-то проинтерполировать между табличными значениями; и рассчитать функцию, используя разложение в ряд. Можно скомбинировать это все.
Там используется формула апроксимации по таблице линейных приближений, а потом шаги методом ньютона
(32) Для синуса - возможно. А для экспоненты или логарифма - плохо себе представляю. Просто не знаю, как реально происходит вычисление экспоненты. В частности, как представлено основание натуральных логарифмов. Возможно, рациональным числом с большими числителем и знаменателем или коyечным числом членов цепной дроби).
Это я к тому, что за, казалось бы, "простыми" функциями может лежать нечто малоизвестное.
Например, есть очень быстрый алгоритм вычисления квадратного корня (с "суперэкспоненциальной" сходимостью) и время вычисления SQRT(x) может сильно отличаться от x^1/2.
(30)Так а куда без матана? Матан - инструмент для других наук, которые помогают решать сложные задачи.
(37) О, да! Особенно выбор жены-мужа, математическая оценка ипотеки, купи-продайка и прочее. И главное, каждому технарю, и еще главнее с ручкой и листочком. Очнись! Ты не в 18 веке!
🙂
(38) В вузе дают общее и специальное образование. Общее занимает максимум 2 года. Матан входит в общее.
Мой лектор как-то сказал: "Неважно что учить, хоть начертательную геометрию, лишь бы мозги развивались". Именно для этого и нужны общие дисциплины. Например, в теоретической физике Вы найдете самое большое разнообразие моделей (подходов), а в жизни теорфиз не нужен.
Ориентация на использование современных инструментов порой приводит с комическим ситуациям: один из наших преподавателей в Париже упоминал случай, когда в качестве ответа на задачу оценить радиус Земли (по каким-то другим данным), студент получил 10 см и его это не смутило.
Сам сталкивался: "Девочки, Воронеж это на Урале?".
(39) Вот видишь, не помогает терфизика для поиска Воронежа.
Причем, одним не поможет, если они ее будут изучать, другим - если не будут. Кста, пример твой "про Воронеж" это логическое следствие изучения матана или терфизики?
Человек может неплохо разбираться в точных науках и плохо в географии
(40) вообще - это логичное следствие того, что у данных людей самые сложные задачи, которые они могут представить - это "выбор жены-мужа, математическая оценка ипотеки, купи-продайка и прочее. "
+(42) им тупо не нужны мозги для жизни. А если уж свои мозги не нужны, то нахрена им какой-то Воронеж?
Не знаю, не знаю. где Урал, о фразы "Ты что, с Урала?" и "Воронеж" - частенько в одном контексте встречаются. Из чего можно сделать вывод, что Воронеж на Урале, вполне логичный вывод.
(39) На самом деле это отмазка: вас (и нас), просто плохо учили. И , тем более, не учили применять полученные знания. такие вот "лекторы"
Вспомнил. Это называется "функциональная безграмотность"
(45) Нас учили вообще лишь "договориться, как сдать предмет", по-большей части. И, это не о деньгах или других материальных компенсациях кому-либо.
Нафиг вообще нужно это поголовное высшее образование. Людей, которых действительно стоит учить по вышке, гораздо меньше и работать они должны по специальности и зарплата должна быть соответствующая. Опустили вышку до уровня ПТУ. Автор ветки стопудово институт закончил и задает дикие вопросы на форуме.
(48) Красавец! 🙂 Все точно подметил.
(48) от меня тоже плюс
На текущий момент, в 95% случаев идут не получать знания(так как они потом реально не нужны, а нужна бумажка, что есть ВО), а сдавать экзамен (или, как справедливо написано в (47), "договориться, как сдать").
ну и потом закономерно возникают вопросы "а зачем оно вообще надо?".
(45) Считаю, что меня учили неплохо (не все учителя и преподаватели, но большинство).
За что я им благодарен - они свое дело сделали.
А найдут ли знания (база) применения на практике - это и от человека зависит и от обстоятельств: "Ландау, погибший в хромом лаборанте, Коперник, погибший в Ландау галантном - Встаньте".
(48) Пусть человек сам решает, нужна ли ему вышка и зачем.
Система должна предоставить ему возможность такого выбора.
Бесплатно, для тех, кто "перспективен", платно - по желанию.
(39) Хм. странный у вас препод был. Хотя х.з. Мне вот вообще предметы не даются пока я не пойму где их применять можно. Из-за этого с языками (русский, английский, немецкий) всегда проблемы. Линейную алгебру плохо знаю, т.к. узнал что ее моно применять при работе с 3d графикой только после того как курс закончился. Та-же ситуация с ТАУ. Когда начал готовится к экзамену решил посмотреть оглавление учебника, а там перед оглавлением были таблицы с заменой блоков управления электронными схемами. Тут я понял что это за предмет, но опять было поздно. А так и вышку по жизни использовал, и термех, и философию и политологию, и даже историю. Хотя с историей конечно сложновато.
(52) Есть у меня знакомый. Офицер ПВО в отставке. Тоже утверждал, что его учили хорошо его делу.
Вот, потом как-то, обмолвился, что стрелять из табельного ПМ и, при этом, попадать в мишень, он научился уже работая охранником.
(52) "Пусть человек сам решает, нужна ли ему вышка и зачем. "
Ясен пень вышка уму нужна. Только ума у него нету на эту вышку. Я хочу что бы инженер был уважаемый человек, а не любая баба с пузом с тремя высшими образованиями.
(55) ну умы, они разные бывают,
писать хорошие картины или стихи - тоже ум нужен, со своим укладом.
Но для технарей - конечно вышка крайне желательна(по крайней мере - прикладные направления)
А инженеров, реально классных инженеров - и сейчас уважают, потому что днем с огнем не сыщешь.
(53) Если преподавать так как ты хочешь - с пониманием, то финальный предмет должен аккумулировать в себе солянку из всего прошедшего материала/курсов. Практика показала, что много студентов будет пересдавать какой-то контроль по несколько раз, и не факт что сдаст. Я поясню - есть такой предмета схемотехника и там есть курсач - спроектировать какое-то устройство, которое предположим тупо должно считать в каком-то дд-коде до 16. Результат должен быть представлен как в виде расчетно-пояснительной записки, включая весь комплект конструкторско-технологической документации. Эту простую задачу на самом деле решить комплексно для студента крайне тяжело, т.к. ему во-первых нужно знать университетсткий курс прикладной теории цифровых автоматов, чтобы элементарно можно было построить нужные схемы. Это автоматом включает знание курса по булевой алгебре. Далее, нужно перенести твои абстрактные автоматы на элементную базу - это курсы по непосредственно схемотехники, электроники, и электротехнике. Далее, после получения собственно схемы, нужно развести саму плату, либо запрограммировать ПЛИС. Соответственно, это либо Аltium и полный фарш, либо разводка в altium, симуляция где-то еще. Но и это еще не все. Софт скорее всего, если в случае печатной платы, не до разведет вам ее до конца, нужна будет ручная доразводка. Это еще один курс. Заметьте - вот_это_все - это очень простая задача, уже сформулированная, где нет никакого матана, нет никаких оту и прочего дерьма. Т.е. кто-то поставил учебную задачу и сформулировал ее. Если перейти к мало-мальски реальной задачи, то до постановки собственно задания на разработку, нужна некая мат.модель самого объекта. Это еще минимум 3 курса оту - и это только введение.
И получается, если преподавать так, чтобы "было понятно где это применять" - мало кто доучится до конца. Скорее всего единица с потока, и то хорошо. Поэтому делают не так - а преподают кучу всего в надежде и расчете того, что когда надо - ты вспомнишь и будешь знать "где копать дальше".
(57) В этом примере, как раз - нет непонятного. От оформления технической документации, до элементов реализации.
А вот в обсуждаемой теме матана - там всё непонятно.
П=Ф(х) разложили в ряды, преобразовывали в течении трёх часов и в конце - доказали, что да, что ни делай, а П=Ф(х).
Вот так мимо пролетают трёх часовки в течении трёх лет
(58) Плюсую, а потом "спецы" с этим "П=Ф(х)" биби делают, асфальт укладывают, дома строят, людей лечат. А мозги у всех невероятно развиты, что просто АХ!
(58) это чтобы потом попытаться объяснить, почему ты сделал плохо, а тот кто учился - хорошо. Чтобы о от О отличал
Возведение в степень в паскале
Вопросы "возвденеие в степень pascal" или "возведение в степень на Паскале" являются наиболее популярными в своей тематике. Не всегда представляется возможным умножать число само на себя (например x := x * x;) в силу динамично изменяющихся параметров задачи, да и при больших показателях степени размер кода может увеличиться во много раз. Кроме того, подобное выражение не предусматривает возможность возведения числа в дробную степень.
Возведение в степень в паскале можно реализовать несколькими способами. Рассмотрим их, установив преимущества и недостатки каждого
Универсальная функция возведения в степень в pascal
Самый эффективный и правильный способ - взятие экспоненты от логарифма Exp(X*Ln(Y)), где X - степень числа, Y - основание. Однако, необходимо учитывать частные случаи когда основание или степень отрицательные числа, либо когда один из них является нулем. Также необходимо учесть тот факт, что при возведении отрицательного числа в четную степень, результат становится положительным
if (x > 0) then pow := Exp(y*Ln(Abs(x))) else
if (l mod 2 = 0) then R:=Abs(pow);
if (y = 0) then Pow :=1;
Возведение в степень с помощью цикла
Является одним из самых простых и быстрых способов. Задается цикл от единицы до требуемого показателя, в котором основание складывается с самим собой. Организовать подобный алгоритм можно использовав как for, так и while или repeat.
for i:=1 to pow-1 do
Возведение в степень с помощью рекурсии
Аналогично предыдущему итерационному способу. Отличие заключается только в том, что вместо очередного вызова тела цикла используется вызов функции (рекурсия).
Возведение в степень в pascal для целого показателя, вычисляемого за время log2(pow)
Данный алгоритм также, как и два предыдущих работает только с целыми показателями степени. Однако, время затрачиваемое на вычисление существенно сокращается.
function power (x,pow:integer):integer;
var res: integer;
while (pow > 0) do
if (pow and 1 = 1) then res := res * x;
Таким образом, возвести число в степень в паскале с дробным показателем может позволить только универсальная функция возведения в степень. Использование первого способа является наиболее быстродейственным. Это особенно заметно, при больших значениях степени и большого числа знака после запятой. Следует отметить, что помимо перечисленных выше способов существуют и другие алгоритмы реализующие в Turbo Pascal возведение в степень.
Возведение в степень в pascal - Универсальная функция возведения в степень (1 способ)
Функция Power - Простое итерационное вычисление степени с помощью цикла (2 способ)
Рекурсивное возведения числа в степень - Возведение числа в степень с помощью рекурсии (3 способ)
Быстрое возведение в степень в паскале - Алгоритм с вычислением за время log2(pow) (4 способ)
| Карта сайта |
| С информацией по модернизации сайта bpascal.ru, техническим неисправностям, а также вопросами по размещению рекламы обращаться по адресу ShekhovtsovY@yandex.ru. Ваше заявление будет рассмотрено в кратчайшие сроки. |