Дефиниция на Pascal ** (експонента)

Търсих дефиницията в Extended Pascal за операцията за степенуване **. Търся от известно време и не мога да го намеря.

i.e 2**3 = 8

person thesentyclimate413    schedule 13.03.2013    source източник
comment
Какво имаш предвид под дефиниция? Нарича се степенуване и вероятно се прилага с помощта на подхода на квадрат и умножение или някакъв негов вариант.   -  person Thomas    schedule 13.03.2013
comment
Повечето реализации на Pascal предоставят стандартни функции за Exp, Ln и Power. Например: freepascal.org/docs-html/rtl/math/power .html   -  person paulsm4    schedule 13.03.2013
comment
Търсех как Паскал го внедри   -  person thesentyclimate413    schedule 13.03.2013
comment
Free Pascal не следва разширения Pascal, ние просто заимствахме синтаксиса, когато внедрихме оператор за степенуване. Pascal стандартите afaik все още изискват такса за получаване, въпреки че части от тях са били забелязани да се носят в мрежата (въз основа на публикувани битове или чернови?)   -  person Marco van de Voort    schedule 13.03.2013
comment
Компилаторите са свободни да прилагат езикови функции, както пожелаят. Няма единна дефиниция за това как Pascal имплементира оператора. От кой компилатор търсихте дефиницията на оператора?   -  person Rob Kennedy    schedule 13.03.2013


Отговори (1)


Във FreePascal е реализиран в математическата единица:

operator ** (bas,expo : float) e: float; inline;
  begin
    e:=power(bas,expo);
  end;


operator ** (bas,expo : int64) i: int64; inline;
  begin
    i:=round(intpower(bas,expo));
  end;

function power(base,exponent : float) : float;

  begin
    if Exponent=0.0 then
      result:=1.0
    else if (base=0.0) and (exponent>0.0) then
      result:=0.0
    else if (abs(exponent)<=maxint) and (frac(exponent)=0.0) then
      result:=intpower(base,trunc(exponent))
    else if base>0.0 then
      result:=exp(exponent * ln (base))
    else
      InvalidArgument;
  end;

function intpower(base : float;const exponent : Integer) : float;

  var
     i : longint;

  begin
     if (base = 0.0) and (exponent = 0) then
       result:=1
     else
       begin
         i:=abs(exponent);
         intpower:=1.0;
         while i>0 do
           begin
              while (i and 1)=0 do
                begin
                   i:=i shr 1;
                   base:=sqr(base);
                end;
              i:=i-1;
              intpower:=intpower*base;
           end;
         if exponent<0 then
           intpower:=1.0/intpower;
       end;
  end;   
person BeniBela    schedule 13.03.2013