На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила ЧаВо (FAQ) разделов Паскаля
В этом разделе разрешено создавать только темы, в которых описано РЕШЕНИЕ какой-либо общей проблемы, или описание какого-либо аспекта языка Паскаль.
Обсуждение уже созданных тем разрешено, но только конструктивное, например указание на ошибку или уточнение имеющегося текста.

Также читать Требования к оформлению статей
Модераторы: Romtek, volvo877
  
    > Как возвести число в степень? , Несколько способов это сделать.
      Разберём несколько способов возведения числа в степень.

      1й способ. «Лобовой». В цикле, n раз увеличиваем переменную «р» в Х (основание степени) раз.
      ExpandedWrap disabled
        function step(x:real;n:integer):real;
        var i:integer;
            p:real;
        begin
            p:=1;
            if n=0 then step:=1;
            if n>0 then for i:=1 to abs(n) do p:=p*x;
            if n<0 then for i:=1 to abs(n) do p:=p/x;
            step:=p
        end;


      2й способ. Рекурсивный. Будет отнимать много памяти при больших степенях.
      ExpandedWrap disabled
        function Step(X:real;N:integer):real;
        begin
             if N=0 then Step:=1 else
             if N<0 then Step:=1/Step(X,-N)
                    else Step:=X*Step(X,N-1);
        end;


      3й способ. Наверное самый удобный. Из математики известно: если x=a^b, то x=Exp(b*ln(a))
      ExpandedWrap disabled
        function step(x,k:real):real;
        begin
             step:=Exp(k*ln(x));
        end;
        Да. Хотелось бы теперь увидеть все типы ограничений при возведении последним способом
        Например чтобы нормально работали варианты "-1^0.5" (корень квадратный из отр. числа) не хотелось бы чтобы программа вылетала с ошибкой. Или корень любой степени из нуля.
          Ну не сёвый же код сюда постить... :unsure:
          Насчет ограничений - там всего одно: a>0 и все. И не возведешь ты так -1 в степень 1/3 :(
          Для дробных степеней надо вот так:
          ExpandedWrap disabled
            function fracstep(x:real;m,n:integer):real;
            var pr:real;
                i:integer;
            begin
              if n=0 then begin
                writeln('Error calling fracstep: divisor of power is 0');
                fracstep:=1;
                exit end;
              if n<0 then begin
                m:=-m; n:=-n;
              end;
              if ((n-1) and 1>0) and (x<0) then begin
                writeln('Error calling fracstep, square root from negative number');
                writeln('DEBUG: x=',x,',m=',m,',n=',n);
                fracstep:=0;
                exit end;
              if (x=0) and (n>1) then begin
                writeln('Error calling fracstep, cannot take a root from zero');
                fracstep:=0;
                exit end;
              pr:=1;
              for i:=1 to m do pr:=pr*abs(x);
              pr:=exp(1/n*ln(pr));
              if (x<0) and ((m and 1)>0) then pr:=-pr;
              fracstep:=pr;
            end;
          Сообщение отредактировано: vesper1 -
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0254 ]   [ 16 queries used ]   [ Generated: 11.12.24, 19:17 GMT ]