|
|
1.1 root 1: //////////
2: / libm 8087
3: / tanh(d)
4: //////////
5:
6: #include "larges.h"
7: #include "ifno8087.h"
8:
9: .globl tanh_
10: .globl exp
11: .globl tstcc
12:
13: //////////
14: / double
15: / tanh(d)
16: / double d;
17: /
18: / tanh(d) = (exp(d) - exp(-d)) / (exp(d) + exp(-d))
19: / = (1 - exp(-2 * d)) / (1 + exp(-2 * d)) (used for d > 0)
20: / = - (1 - exp(2 * d)) / (1 + exp(2 * d)) (used for d < 0)
21: //////////
22:
23: d = RASIZE / arg offset
24:
25: tanh_:
26: ifno8087(_tanh_)
27: mov bx, sp
28: fdld Pss d(bx) / Load argument d.
29:
30: Gcall tstcc / Check sign of d.
31: je 1f / d is zero, just return it.
32: jb 0f / Jump if negative.
33: fchs / Change positive to negative.
34:
35: 0: pushf / Save the flags.
36: fadd st, st / 2 * d
37: Gcall exp / exp(2 * d)
38: fld1 / 1, exp(2 * d)
39: fsub st, st1 / 1 - exp(2 * d), exp(2 * d)
40: fld1 / 1, 1 - exp(2 * d), exp(2 * d)
41: faddp st2, st / 1 - exp(2 * d), 1 + exp(2 * d)
42: fdivr / (1 - exp(2 * d)) / (1 + exp(2 * d))
43: popf / Restore the flags.
44: ja 1f / d was positive, done.
45: fchs / d was negative, flip result sign.
46:
47: 1: Gret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.