Submitted by Steve Fewell
Routine:EXP
Name: EXP (Exponential)
Starting Address: &A9DF
Entry criteria: The FWA contains the value to work with
Exit: The FWA contains the result.
Description:
Get the Numeric value (if integer then convert to Float, if String then Type Mismatch error).
If the FWA value has an exponent greater than #&87 (or equal to #&87 with a mantissa value >= &B3)
and the FWA sign is positive, then generate a EXP range error. Otherwise, if the FWA contains
a negative value then run the Clear FWA routine and exit with FWA = 0.0.
Thus 89.49999 is the largest value before the EXP range error is issued. No error is given
for negative values, as negative numbers with a large exponents return an EXP result of 0.
Call &82E0 to Split the FWA value into its Integer and Fractional parts. This is done as the
separate parts need to be calculated separately. This routine puts the 1-byte Integer value into &49
and the fractional value in the FWA.
Evaluate the EXP continued-fraction expansion series (A861) with X=#&CE, A=#&F6 and Y=#&03.
Thus the parameters to the evaluate series routine are as follows:
Default value (if FWA value too small to calculate) = &BFF6 = 1
First Floating-Point constant to use = &BFCE.
Number of cycles to evaluate = #&03.
The series is evaluated as follows:
If FWA too small then return 1 (&BFF6).
FWA = 1/FWA (store in Temporary Floating-Point variable address &046C)
FWA = 0.071206464 + FWA [Floating-Point constant &BFCE]
FWA = 0.00710252642 / FWA [Floating-Point constant &BFD3]
FWA = 0.000254009799 + FWA [Floating-Point constant &BFD8]
FWA = &046C [1/orig FWA] + FWA
FWA = 0.0166665235 / FWA [Floating-Point constant &BFDD]
FWA = 0.000000662400541 + FWA [Floating-Point constant &BFE2]
FWA = &046C [1/orig FWA] + FWA
FWA = 0.0833333324 / FWA [Floating-Point constant &BFE7]
FWA = -0.499999997 + FWA [Floating-Point constant &BFEC]
FWA = &046C [1/orig FWA] + FWA
FWA = 1 / FWA [Floating-Point constant &BFF1]
FWA = 1 + FWA [Floating-Point constant &BFF6]
This gives the EXP value for the fractional part of the value.
Store the series result to Temporary Floating-Point variable location &0476.
Unpack the Floating point constant at location &BF47 to the FWA.
This value is 2.71828183 (or EXP(1)).
Set A to &49 (the Integer part of the original FWA value).
Call &A5BE to raise the FWA to the power of the Integer value in A.
Multiply the FWA (the EXP result for the Integer part of the value) by
&0476 (the EXP result for the fractional value).
Now, we have the complete EXP result, so exit with the FWA set to this result.
Example 1:
Calculate EXP(1.245)
1.245 => Exponent = &81, Mantissa 1 = &1F, Mantissa 2 = &5C, Mantissa 3 = &28, Mantissa 4 = &F6
?&49 = 1.
FWA = 0.245
Calculate reciple -> FWA = 1/FWA = 4.08163265. Store this value in location &046C.
FWA = 0.071206464 + FWA = 4.15283911706
FWA = 0.00710252642 / FWA = 0.0017102821033
FWA = 0.000254009799 + FWA = 0.0019642919023
FWA = &046C + FWA = 4.083596941902
FWA = 0.0166665235 / FWA = 0.0040813341123
FWA = 0.000000662400541 + FWA = 0.0040819965128
FWA = &046C + FWA = 4.08571464651287
FWA = 0.0833333324 / FWA = 0.02039626836669
FWA = -0.499999997 + FWA = -0.4796037286333
FWA = &046C + FWA = 3.60202892136669
FWA = 1 / FWA = 0.27762131338484
FWA = 1 + FWA = 1.27762131338484. Store in &0476.
FWA = 2.71828183 Raised to the power of 1 = 2.71828183
FWA = 1.27762131338484 * FWA = 3.47293480179. This is the EXP value of 1.245.
Example 2:
Calculate EXP(8.17)
8.17 => Exponent = &84, Mantissa 1 = &02, Mantissa 2 = &B8, Mantissa 3 = &51, Mantissa 4 = &EC
?&49 = 8.
FWA = 0.17
Calculate reciple -> FWA = 1/FWA = 5.882352941176. Store this value in location &046C.
FWA = 0.071206464 + FWA = 5.953559405176
FWA = 0.00710252642 / FWA = 0.00119298825066
FWA = 0.000254009799 + FWA = 0.00144699804966
FWA = &046C + FWA = 5.88379993922566
FWA = 0.0166665235 / FWA = 0.00283261220166
FWA = 0.000000662400541 + FWA = 0.0028332746022
FWA = &046C + FWA = 5.8851862157782
FWA = 0.0833333324 / FWA = 0.014159846323398
FWA = -0.499999997 + FWA = -0.4858401506766
FWA = &046C + FWA = 5.396512790499398
FWA = 1 / FWA = 0.185304851266267
FWA = 1 + FWA = 1.185304851266267. Store in &0476.
FWA = 2.71828183 Raised to the power of 8 = 2980.9580005606
FWA = 1.185304851266267 * FWA = 3533.3439794855. This is the EXP value of 8.17.
A9DF | 032 218 150 | 20 DA 96 | JSR &96DA Get and check Float value | |
A9E2 | 0 | 165 048 | A5 30 | LDA &30 |
A9E4 | 201 135 | C9 87 | CMP#&87 | |
A9E6 | 144 015 | 90 0F | BCC 15 --> &A9F7 | |
A9E8 | 208 006 | D0 06 | BNE 6 --> &A9F0 | |
A9EA | 1 | 164 049 | A4 31 | LDY &31 |
A9EC | 192 179 | C0 B3 | CPY#&B3 | |
A9EE | 144 007 | 90 07 | BCC 7 --> &A9F7 | |
A9F0 | . | 165 046 | A5 2E | LDA &2E |
A9F2 | 016 200 | 10 C8 | BPL -56 --> &A9BC EXP range error | |
A9F4 | L | 076 180 166 | 4C B4 A6 | JMP &A6B4 Clear FWA |
A9F7 | 032 224 130 | 20 E0 82 | JSR &82E0 Split FWA (into Integer/Fractional parts) | |
A9FA | 162 206 | A2 CE | LDX#&CE | |
A9FC | 169 246 | A9 F6 | LDA#&F6 | |
A9FE | 160 003 | A0 03 | LDY#&03 | |
AA00 | a | 032 097 168 | 20 61 A8 | JSR &A861 Evaluate continued-fraction expansion series |
AA03 | 032 013 165 | 20 0D A5 | JSR &A50D Store FWA to &0476 | |
AA06 | G | 169 071 | A9 47 | LDA#&47 |
AA08 | 032 150 168 | 20 96 A8 | JSR &A896 Load FWA with FP constant at &BF00 + A | |
AA0B | I | 165 073 | A5 49 | LDA &49 |
AA0D | 032 190 165 | 20 BE A5 | JSR &A5BE Raise FWA to power of Integer value in A | |
AA10 | 128 141 | 80 8D | BRA -115 --> &A99F Multiply FWA by &0476 |