|
|
1.1 root 1: #print
2: Write a subroutine myexp(x) which expects a floating
3: argument x and returns the floating point value
4: of e to the x. An adequate algorithm
5: for the purpose is the standard Maclaurin series
6:
7: x 2 3 4
8: e = 1 + x + x /2! + x /3! + x /4! + ...
9: Name your routine myexp(), not exp(). You can test it, then,
10: by comparing it with the system routine as well as by
11: comparing it with tables. Leave it on file
12: myexp.c, and then type "ready".
13: #once #create reldif.c
14: double reldif(a,b)
15: double a,b;
16: {
17: double c,d;
18: if (a==0. && b==0.) return(0.);
19: c = a>0 ? a : -a;
20: d = b>0 ? b : -b;
21: c = c>d ? c : d;
22: return( (a-b)/c );
23: }
24: #once #create tzaqc.c
25: main()
26: {
27: double x,y, log(), myexp(), reldif();
28: for(x=1.; x<5.; x=+ 0.2)
29: {
30: y = myexp(x);
31: if (reldif(x, log(y)) >1.e-5) return(1);
32: }
33: return(0);
34: }
35: exp()
36: {
37: printf("Cheat! you called the system routine\n");
38: return(1.2);
39: }
40: #user
41: cc tzaqc.c myexp.o reldif.c
42: a.out
43: #succeed
44: /* one way */
45: double myexp(x)
46: double x;
47: {
48: double term, sum, dabs();
49: int n;
50:
51: term = sum = 1.0;
52: n = 1;
53: while (dabs(term) > dabs(sum)/1.e8) {
54: term = term * x / n++;
55: sum += term;
56: }
57: return(sum);
58: }
59:
60: double dabs(x)
61: double x;
62: {
63: return(x>0 ? x : -x);
64: }
65: #log
66: #next
67: 50.1a 10
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.