| 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; |
|
|