49 lines
1.6 KiB
Plaintext
49 lines
1.6 KiB
Plaintext
Public Function exp(ByVal base As Variant, ByVal exponent As Long) As Variant
|
|
Dim result As Variant
|
|
If TypeName(base) = "Integer" Or TypeName(base) = "Long" Then
|
|
'integer exponentiation
|
|
result = 1
|
|
If exponent < 0 Then
|
|
result = IIf(Abs(base) <> 1, CVErr(2019), IIf(exponent Mod 2 = -1, base, 1))
|
|
End If
|
|
Do While exponent > 0
|
|
If exponent Mod 2 = 1 Then result = result * base
|
|
base = base * base
|
|
exponent = exponent \ 2
|
|
Loop
|
|
Else
|
|
Debug.Assert IsNumeric(base)
|
|
'float exponentiation
|
|
If base = 0 Then
|
|
If exponent < 0 Then result = CVErr(11)
|
|
Else
|
|
If exponent < 0 Then
|
|
base = 1# / base
|
|
exponent = -exponent
|
|
End If
|
|
result = 1
|
|
Do While exponent > 0
|
|
If exponent Mod 2 = 1 Then result = result * base
|
|
base = base * base
|
|
exponent = exponent \ 2
|
|
Loop
|
|
End If
|
|
End If
|
|
exp = result
|
|
End Function
|
|
Public Sub main()
|
|
Debug.Print "Integer exponentiation"
|
|
Debug.Print "10^7=", exp(10, 7)
|
|
Debug.Print "10^4=", exp(10, 4)
|
|
Debug.Print "(-3)^3=", exp(-3, 3)
|
|
Debug.Print "(-1)^(-5)=", exp(-1, -5)
|
|
Debug.Print "10^(-1)=", exp(10, -1)
|
|
Debug.Print "0^2=", exp(0, 2)
|
|
Debug.Print "Float exponentiation"
|
|
Debug.Print "10.0^(-3)=", exp(10#, -3)
|
|
Debug.Print "10.0^(-4)=", exp(10#, -4)
|
|
Debug.Print "(-3.0)^(-5)=", exp(-3#, -5)
|
|
Debug.Print "(-3.0)^(-4)=", exp(-3#, -4)
|
|
Debug.Print "0.0^(-4)=", exp(0#, -4)
|
|
End Sub
|