在扩展Pascal中实现x^(e),而不使用求幂运算符

在扩展Pascal中实现x^(e),而不使用求幂运算符,pascal,pow,exponentiation,exp,Pascal,Pow,Exponentiation,Exp,作为我正在构建的Pascal ISO 10206程序的一部分,我需要实现一个函数,将实数(x)乘以欧拉数(e),而不使用Pascal(**,pow,exp…)中已经包含的任何求幂函数 我已经尝试了几个小时不同的算法,但是如果不使用已经包含的求幂函数,我想不出怎么做 任何帮助都将不胜感激。任何一种数学算法等等。。。提前感谢。正如其他人所说,不使用Exp()或基于它的函数是没有意义的。但是,如果你真的必须使用其他东西,并且不想太过技术化/数学化,那么下面的方法应该有效(真正的算法要复杂得多,需要更多

作为我正在构建的Pascal ISO 10206程序的一部分,我需要实现一个函数,将实数(x)乘以欧拉数(e),而不使用Pascal(**,pow,exp…)中已经包含的任何求幂函数

我已经尝试了几个小时不同的算法,但是如果不使用已经包含的求幂函数,我想不出怎么做


任何帮助都将不胜感激。任何一种数学算法等等。。。提前感谢。

正如其他人所说,不使用
Exp()
或基于它的函数是没有意义的。但是,如果你真的必须使用其他东西,并且不想太过技术化/数学化,那么下面的方法应该有效(真正的算法要复杂得多,需要更多的数学知识)

该程序将泰勒级数的前N项组合用于X的分数和X的整数部分的二元幂运算。它可能不是很快,但相当精确,即使对于较大的指数也是如此。为了进行比较,我还显示了Exp(X)。如果您的Pascal有一个
Double
Extended
类型,请使用这些类型而不是
Real

program SimplePower;

{ Required for Delphi, you can omit it in other Pascals: }
{$APPTYPE CONSOLE}

{ Returns approximate value of e^X using sum of first N terms of Taylor series.
  Works fine with X values between 0 and 1.0 and N ~ 30. }
function Exponential(N: Integer; X: Real): Real;
var
  I: Integer;
begin
  Result := 1.0;
  for I := N - 1 downto 1 do
    Result := 1.0 + X * Result / I;
end;

{ Binary exponentiation of Base by integer Exponent. }
function IntegerExp(Base: Real; Exponent: Integer): Real;
begin
  Result := 1.0;
  while Exponent > 0 do
  begin
    if Odd(Exponent) then
      Result := Result * Base;
    Base := Base * Base;
    Exponent := Exponent shr 1;
  end;
end;

{ Combines IntegerExp function for integral part with 
  Exponential function for fractional part. }
function MyExp(N: Integer; X: Real): Real;
const
  E = 2.7182818284590452353602874713527; { from Google: "e euler" }
var
  Factor: Real;
  Fraction: Real;
begin
  Fraction := Exponential(N, Frac(X));
  Factor := IntegerExp(E, Trunc(X));
  Result := Factor * Fraction;
end;

{ Simple demo: }
const
  N = 30;
  X = 73.4567890242421234;

begin
  Writeln('MyExp(', N, ', ', X:22:18, ') = ', MyExp(N, X):22:18);
  Writeln('Exp(', X:22:18, ')       = ', Exp(X):22:18);
end.
参考:


我没有对负指数做任何处理,但只知道
Exp(-x)=1/Exp(x)
。你可以用这些知识来修改MyExp。

我使用了@RudyVelthuis在其他帖子中指出的解决方案,但做了一些修改。它是基于x^0.5=sqrt(x),我们可以利用它来发挥我们的优势。我将把我使用的Pascal ISO 10206代码附在附件中。谢谢大家的帮助,特别是鲁迪

function MyPow(base,power,precision:real):real;
begin
    if (power<0) then MyPow:=1/MyPow(base,-power,precision)
    else   if (power>=10) then MyPow:=sqr(MyPow(base,power/2,precision/2))
    else   if (power>=1) then MyPow:=base*MyPow(base,power-1,precision)
    else   if (precision>=1) then MyPow:=sqrt(base)
    else MyPow:=sqrt(MyPow(base,power*2,precision*2));
end; 
函数MyPow(基数、功率、精度:real):real;
开始
如果(功率=10),则MyPow:=sqr(MyPow(基本功率/2,精度/2))
否则,如果(功率>=1),则MyPow:=base*MyPow(基本,功率-1,精度)
否则,如果(精度>=1),则MyPow:=sqrt(基本)
else MyPow:=sqrt(MyPow(基功率*2,精度*2));
结束;

这似乎是在浪费时间。不使用exp是没有意义的。在任何情况下,你都可以通过一些研究找到一些已发布的算法。你做了什么研究?看看。它们可用于计算值x(以及更多)的
Exp()
。只需使用一个循环来递增、相加或相乘series中的值。FWIW,您有一个Free Pascal标记,但您说您使用的是Extended Pascal。这些不一样。你在找x^e还是e^x?后者是
Exp()
函数,但前者也可以用它来计算。@RudyVelthuis不是真的。无穷和的收敛速度太慢,无法使用。您确定是指
x^e
而不是
e^x
?后者是一个更常用的函数。我看到两个反对票。关于“为什么”的评论会很好,很酷。但请注意,我给出的解决方案稍微更准确一些。在最初的版本中,我使用了Delphi的扩展(80位)类型,它始终给出正确的结果。