Программка для вычисления значения любой степени из любого числа. (дробь, корень, отрицательный..)
У меня было задание, достаточно простое - написать программу на Паскале для возведения числа в степень с использованием функции.
Прилагался пример который надо решить с помощью программы. Что-то вроде 2^2, 3^-7. Это все можно было бы сделать через цикл for, но
мне же захотелось программку, которой не страшно возвести любое число в любую степень.
Для начала нужно было вспомнить математику. Долго вспоминать не пришлось, сразу же на первый запрос в google была найдена необходимая формула:
x^n = exp(n*ln(x)).
Сразу же задумался, а вдруг уже есть программа в свободном виде. Зачем придумывать велосипед, хоть мне честно интереснее придумать, чем "слизнуть".
Итак, потыкав в поисковик (пальцем) он ничего толкового не выдал: все ссылки на форумы программистов не считая пары ссылок на проекты Ответ/Вопрос (или наоборот..), но ответа кроме:
"Пользуйся формулой, сынок! exp(n*ln(x)), как папа программист сказал."
Достаточно грубые программисты.. Если задолбали новички, то зачем вообще отвечать на вопросы и уж тем более в такой форме. (я вообще критикую все на своем пути, за это прошу прощениеца).
Кстати, отцы просто отвечали, что без вариков что-то по другому, как работает, так и работает. Что в принципе странно..
Недолго по набирая и несильно напрягаясь, был написан код. На этом заканчиваю вводную часть поста и вывожу сам листинг. (к сожалению форматирование текста в блоггере косячит, поэтому код оформлен без отступов)
Идея проста берем принцип : x^n = exp(n*ln(x)). Корни, дроби, отрицательность работают.
Код с комментариями:
uses crt;
var
e:real;
// описание функции ext();степени
function ext(x,n:real):real;
var
// переменная для хранения результата
m:real;
begin
// если степень = 0
if n=0 then begin
// результат = 1
ext:=1;
// выход из функции
exit;
end;
// если число отрицательно
if x<0 then m:=-1*exp(n*ln(abs(x))) else
// если число положительно
if x>0 then m:=exp(n*ln(x)) else
// если число = 0
m:=0;
// проверка дробности, если целое, ->
if n/round(n)=1 then begin
// то если степень четная и полож, ->
if (round(n) mod 2 = 0) and (n>0) then
// то результат будет полож иначе отриц
ext:=abs(m) else ext:=m;
end;
// если дроб, ->
// если число отриц, а степень дроб, то результат "0"
else if x<0 then ext:=0 else
// если число полож, а степень дроб, то результат тот же
ext:=m;
// конец функции
end;
begin
clrscr;
// вычисление для проверки работы -2.2^-1.3
e:=ext(-2.2,-1.3);
// вывод значения
writeln ('=',e:2:1);
// ожидание ввода
readln;
end.
1 комментарий:
А где ее набивать
Отправить комментарий