ESBIntPower Routines |
Unit
QESBPCSMath
Overloaded Variants |
Function ESBIntPower(const X: LongInt; const N: Byte): Int64; |
Function ESBIntPower(const X: Extended; const N: LongInt): Extended; |
Function ESBIntPower(const X: Extended; const N: LongWord): Extended; |
Declaration
Function ESBIntPower(const X: LongInt; const N: Byte): Int64;
Description
The different overloaded routines allow for better precision depending on the data types involved. The LongInt/Byte is for strictly Integer operations.
Zero to a Negative power raises an Exception.
The LongInt/Byte Routine cannot handle N > 62, as this raises an exception, so for N > 63, take the longint value and multiply it by 1.0 to ensure a different routine gets called.
Thanks to Rory Daulton for improvements.
Parameters |
X | Value to use as the Base |
N | Integer Value to raise the Base to |
Category
Arithmetic Routines for Integers
Arithmetic Routines for FloatsImplementation
function ESBIntPower (const X: LongInt; const N: Byte): Int64; overload; var I: LongWord; begin if N > 62 then raise EMathError.Create (rsPowerInt64); if N = 0 then Result := 1 else if (X = 0) or (X = 1) then Result := X else if X = -1 then begin if Odd (N) then Result := -1 else Result := 1 end else begin Result := X; for I := 2 to N do Result := Result * X; end; End; |
Declaration
Function ESBIntPower(const X: Extended; const N: LongInt): Extended;Implementation
function ESBIntPower (const X: Extended; const N: LongInt): Extended; overload; var P: LongWord; begin if N = 0 then Result := 1 else if (X = 0) then begin if N < 0 then raise EMathError.Create (rsZeroToNegPower) else Result := 0 end else if (X = 1) then Result := 1 else if X = -1 then begin if Odd (N) then Result := -1 else Result := 1 end else if N > 0 then Result := IntPow (X, N) else begin if N <> Low (LongInt) then P := abs (N) else P := LongWord (High (LongInt)) + 1; try Result := IntPow (X, P); except on EMathError do begin Result := IntPow (1 / X, P); { try again with another method, } Exit; { perhaps less precise } end {on}; end {try}; Result := 1 / Result; end; End; |
Declaration
Function ESBIntPower(const X: Extended; const N: LongWord): Extended;Implementation
function ESBIntPower (const X: Extended; const N: LongWord): Extended; overload; begin if N = 0 then Result := 1 else if (X = 0) or (X = 1) then Result := X else if X = -1 then begin if Odd (N) then Result := -1 else Result := 1 end else Result := IntPow (X, N) End; |
|