Паскаль ** определение (показатель степени)

Я искал определение в 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 по-прежнему требуют платы за получение, хотя некоторые из них были замечены в Интернете (на основе опубликованных фрагментов или черновиков?)   -  person Marco van de Voort    schedule 13.03.2013
comment
Компиляторы могут свободно реализовывать функции языка так, как им нравится. Не существует единого определения того, как Паскаль реализует оператор. Определение оператора какого компилятора вы искали?   -  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