|
|
1.1 root 1: //////////
2: / libm 8087
3: / exp(d), two()
4: //////////
5:
6: #include "larges.h"
7: #include "ifno8087.h"
8:
9: .globl exp_
10: .globl exp
11: .globl two
12: .globl floor
13: .globl cfcc87
14: .globl erange
15:
16: //////////
17: / double
18: / exp(d)
19: / double d;
20: /
21: / exp() is passed d on the 8087 stack and returns exp(d).
22: / Uses: exp(x) = 2 ^ (x * log base 2 of e).
23: /
24: / two() is passed d on the 8087 stack and returns 2^d.
25: //////////
26:
27: d = RASIZE / arg offset
28:
29: exp_:
30: ifno8087(_exp_)
31: mov bx, sp
32: fdld Pss d(bx) / Load argument d.
33:
34: exp: / d
35: fldl2e / Load log base 2 of e.
36: fmul / d * log base 2 of e
37:
38: two:
39: ficom cs:maxexp
40: Gcall cfcc87 / Compare d to max exponent.
41: jbe 1f / d is not too big.
42: fstp st / Too big, pop d.
43: Gcall erange / Set errno to indicate out of range
44: fdld cs:infin / and return infinity.
45: Gret
46:
47: 1: ficom cs:minexp
48: Gcall cfcc87 / Compare d to min exponent.
49: jae 2f / d is not too small.
50: fstp st / Too small, pop d
51: fldz / and return 0.
52: Gret
53:
54: 2: fld st / d, d
55: Gcall floor / Round d down to int(d), d
56: fst st2 / int(d), d, int(d)
57: fsub / d-int(d) = fraction(d), int(d)
58: fdcom cs:half
59: Gcall cfcc87 / Compare fraction(d) to .5
60: jbe 3f / fraction(d) <= .5, ok.
61: fdsub cs:half / Set fraction(d) -= .5.
62:
63: 3: f2xm1 / 2^fraction(d) - 1
64: fld1
65: fadd / 2^fraction(d)
66: jbe 4f / Was not >.5, ok as is.
67: fdmul cs:sqrt2 / 2^fr(d) = 2^(fr(d)-.5) * 2^.5
68:
69: 4: fscale / Scale in the integer part
70: fstp st1 / and pop, leaving result.
71: Gret
72:
73: //////////
74: / data
75: //////////
76: sqrt2: .byte 0xCD, 0x3B, 0x7F, 0x66, 0x9E, 0xA0, 0xF6, 0x3F / sqrt(2.)
77: infin: .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x7F / infinity
78: half: .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x3F / .5
79: maxexp: .word 1023 / maximum exponent
80: minexp: .word -1022 / minimum exponent
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.