Помощь - Поиск - Пользователи - Календарь
Полная версия: Люди помогите, кто знает, как возвести в степень
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
Андрей
Кто знает, как значение, типа real возвести в степень типа  real ?
помогите, пожалуйса очень надо ...........
Clane
Q:> А как посчитать x**3 или корень четвертой степени из x?

A: Hе мешало бы вспомнить школьный курс математики.

  x**n=exp(ln(x)*n))
    Ограничение: x>0
  т.о. надо написать:

    If (x > 0) then y:=exp(ln(x)*n))
               else writeln('Error: x**n -> x <= 0 !!!');
Паук
Вот полная функция возведения в степень любых чисел:

Код
(* Функция вычисления степени a^b *)
function power(a,b:real):real;
function relerror(observed,actual:real):real;
begin
    if actual=0.0 then relerror:=abs(observed)
    else relerror:=abs(observed/actual-1);
end;
var
i:byte;
res:real;
begin
if (trunc(b)=b) and (b>0) then
  begin
  res:=1;
  for i:=1 to trunc(b) do
  res:=res*a;
  power:=res;
  exit;
  end;
if a=0 then
  if b=0 then power:=1 else if b<0 then else power:=0
  else if a<0 then if abs(b)< 1e-10 then power:=1
  else if relerror(b,round(b))< 1e-8 then
  power:=(1-2*ord(odd(round(b))))*exp(b*ln(abs(a)))
  else if (relerror(1/b,round(1/b))< 1e-8) and odd(round(1/b)) then
  power:=-exp(b*ln(abs(a)))
  else else power:=exp(b*ln(a))
end;
___ALex___
Код
function IntPower(const Base: Extended; const Exponent: Integer): Extended;
asm
       mov     ecx, eax
       cdq
       fld1                      { Result := 1 }
       xor     eax, edx
       sub     eax, edx          { eax := Abs(Exponent) }
       jz      @@3
       fld     Base
       jmp     @@2
@@1:    fmul    ST, ST            { X := Base * Base }
@@2:    shr     eax,1
       jnc     @@1
       fmul    ST(1),ST          { Result := Result * X }
       jnz     @@1
       fstp    st                { pop X from FPU stack }
       cmp     ecx, 0
       jge     @@3
       fld1
       fdivrp                    { Result := 1 / Result }
@@3:
       fwait
end;

function Power(const Base, Exponent: Extended): Extended;
begin
 if Exponent = 0.0 then
   Result := 1.0               { n**0 = 1 }
 else if (Base = 0.0) and (Exponent > 0.0) then
   Result := 0.0               { 0**n = 0, n > 0 }
 else if (Frac(Exponent) = 0.0) and (Abs(Exponent) <= MaxInt) then
   Result := IntPower(Base, Integer(Trunc(Exponent)))
 else
   Result := Exp(Exponent * Ln(Base))
end;


вот как это сделано в Delphi 6 (ф-ия Power) (взято из исходников)
хотя при чём-то наподобие Power(-2.5, 3.2) будет генерится исключение так как
при вычислении Ln(X), X должно быть больше 0...
P.S. Result в Delphi обозначает имя функции
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.