Power

Chapter I - integer exponent

PROBLEM
A frequently occuring operation in number-theoretic computations is raising a number to a power another number, also known as exponentiation. We would like an efficient way to compute X**Z (X to the Z power), where X is a real number and Z is a nonnegative integer. Usually we use the ** operator for calculation of the power function, raising a real number to a integer exponent. Another way to this calculation is the following algorithm POWER stated by al-Kashi about 1414 C.E.

 

IMPLEMENTATION
Unit: internal function, external function without procedure statement
 
Parameters: real X, nonnegative integer Z
 
Returns: X**Z
 

POWER: procedure parse arg X, Z; Pwr = 1
do forever
if Z // 2 then Pwr = Pwr * X
Z = Z % 2
if Z = 0 then return Pwr
X = X * X
end

 

EXAMPLE
[Regina] The following program ends with Error 26 ... line 3: Invalid whole number

/* BERNOULLI computes e */
numeric digits 20; Z = 1E+9
X = 1 + 1 / Z
say "e =" FORMAT(X**Z,,8)

But program


/* BERNOULLI computes e */
numeric digits 20; Z = 1E+9
X = 1 + 1 / Z
say "e =" FORMAT(POWER(X,Z),,8)
exit
POWER: procedure
...

displays e = 2.71828183


Chapter II - real exponent

The following function REPOWER computes the result by raising the real number X to the given real exponent Z.

 

IMPLEMENTATION
Unit: internal function
 
Parameters: real numbers X and Z, a positive integer P - number of significant digits of result, default is 9
 
Interface: the functions EXP and LN
 
Returns: X**Z or writes error message REAL_POWER: Result is undefined

 

REPOWER: procedure
parse arg X, Z, P
if P = "" then P = 9; P = P + 4; numeric digits P
if DATATYPE(Z, "Whole_number")
  then
    if X = 0 & Z <= 0
      then call ERROR "REPOWER: Result is undefined"
      else return X ** Z
  else
    select
      when X > 0 then return EXP(Z * LN(X, P), P)
      when X = 0 & Z > 0 then return 0
      otherwise
        call ERROR "REPOWER: Result is undefined"
    end
 
ERROR: say ARG(1); exit

 

CONNECTIONS

Literature
Knuth D. E. Seminumerical Algorithms, vol. 2 of The Art of Computer Programming
Addison-Wesley, 1973


Cover Contents Index Main page

last modified 15th August 2001
Copyright 2000-2001 Vladimir Zabrodsky
Czech Republic