Кто знает, как значение, типа real возвести в степень типа real ?
помогите, пожалуйса очень надо ...........
Люди помогите, кто знает, как возвести в степень |
1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
Люди помогите, кто знает, как возвести в степень |
Андрей |
Сообщение
#1
|
Гость |
Кто знает, как значение, типа real возвести в степень типа real ?
помогите, пожалуйса очень надо ........... |
Clane |
Сообщение
#2
|
Гость |
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 !!!'); |
Паук |
Сообщение
#3
|
Гость |
Вот полная функция возведения в степень любых чисел:
Код (* Функция вычисления степени 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___ |
Сообщение
#4
|
Бывалый Группа: Пользователи Сообщений: 282 Репутация: 0 |
Код 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 обозначает имя функции |
Текстовая версия | 6.05.2024 16:37 |