| XtoY Function | 
Unit
QESBPCSMath
Declaration
Function XtoY(const X, Y: Extended): Extended;
Description
Zero to a Negative power raises an Exception.
If the routine can be handled with ESBIntPower then it is used internally.
Thanks to Rory Daulton for improvements.
| Parameters | 
| X | Value to use as Base. | 
| Y | Value to use as Power. | 
Returns
X^Y.
Category
Arithmetic Routines for FloatsImplementation
 
| function XtoY (const X, Y: Extended): Extended;
function PowerAbs: Extended; // Routine developed by Rory Daulton
     var
          ExponentPow2: Extended; // equivalent exponent to power 2
     begin
          try
               ExponentPow2 := ESBLog2 (Abs (X)) * Y;
          except
               on EMathError do
                    // allow underflow, when ExponentPow2 would have been negative
                    if (Abs (X) > 1) <> (Y > 0) then
                    begin
                         Result := 0;
                         Exit;
                    end {if}
                    else
                         raise;
          end {try};
          Result := Pow2 (ExponentPow2);
     end;
begin
     if FloatIsZero (Y) then
          Result := 1
     else if FloatIsZero (X) then
     begin
          if Y < 0 then
               raise EMathError.Create (rsZeroToNegPower)
          else
               Result := 0
     end
     else if FloatIsZero (Frac (Y)) then
     begin
          if (Y >= Low (LongInt)) and (Y <= High (LongInt)) then
               Result := ESBIntPower (X, LongInt (Round (Y)))
          else
          begin
               if (X > 0) or FloatIsZero (Frac (Y / 2.0)) then
                    Result := PowerAbs
               else
                    Result := -PowerAbs
          end;
     end
     else if X > 0 then
          Result := PowerAbs
     else
          raise EMathError.Create (rsInvalidXtoY)
End; | 
|  |