|
|
1.1 root 1: static char Sccsid[] = "ao.c @(#)ao.c 1.1 10/1/82 Berkeley ";
2: #include "apl.h"
3:
4: data
5: ex_add(d1, d2)
6: data d1, d2;
7: {
8:
9: if(fuzz(d1, -d2) == 0)
10: return(zero);
11: return(d1 + d2);
12: }
13:
14: data
15: ex_sub(d1, d2)
16: data d1, d2;
17: {
18:
19: if(fuzz(d1, d2) == 0)
20: return(zero);
21: return(d1 - d2);
22: }
23:
24: data
25: ex_mul(d1, d2)
26: data d1, d2;
27: {
28:
29: return(d1 * d2);
30: }
31:
32: data
33: ex_div(d1, d2)
34: data d1, d2;
35: {
36:
37: /* 0 div 0 is 1 */
38: if(d2 == zero)
39: if (d1 == zero) return(one);
40: else error("div D");
41: return(d1 / d2);
42: }
43:
44: data
45: ex_mod(d1, d2)
46: data d1, d2;
47: {
48: double f;
49:
50: /* x mod 0 is defined to be x */
51: if (d1 == zero)
52: return(d2);
53: if(d1 < zero)
54: d1 = -d1;
55: f = d2;
56: d2 = d2 - d1 * floor(f/d1);
57: return(d2);
58: }
59:
60: data
61: ex_min(d1, d2)
62: data d1, d2;
63: {
64:
65: if(d1 < d2)
66: return(d1);
67: return(d2);
68: }
69:
70: data
71: ex_max(d1, d2)
72: data d1, d2;
73: {
74:
75: if(d1 > d2)
76: return(d1);
77: return(d2);
78: }
79:
80: data
81: ex_pwr(d1, d2)
82: data d1, d2;
83: {
84: register s;
85: double f1, f2;
86:
87: s = 0;
88: f1 = d1;
89: if(f1 > 0.) {
90: f1 = d2 * log(f1);
91: goto chk;
92: }
93: if(f1 == 0.) {
94: return(d2 == zero ? (data)1.0 : zero);
95: }
96: /* check for integer exponent */
97: f2 = floor(d2);
98: if(fabs(d2 - f2) < thread.fuzz){
99: s = (int)f2%2;
100: f1 = d2*log(fabs(f1));
101: goto chk;
102: }
103: /* should check rational d2 here */
104: goto bad;
105:
106: chk:
107: if(f1 < maxexp) {
108: d1 = exp(f1);
109: if(s)
110: d1 = -d1;
111: return(d1);
112: }
113: bad:
114: error("pwr D");
115: }
116:
117: data
118: ex_log(d1, d2)
119: data d1, d2;
120: {
121: double f1, f2;
122:
123: f1 = d1;
124: f2 = d2;
125: if(f1 <= 0. || f2 <= 0.)
126: error("log D");
127: d1 = log(f2)/log(f1);
128: return(d1);
129: }
130:
131: data
132: ex_cir(d1, d2)
133: data d1, d2;
134: {
135: double f, f1;
136:
137: switch(fix(d1)) {
138:
139: default:
140: error("crc D");
141:
142: case -7:
143: /* arc tanh */
144: f = d2;
145: if(f <= -1. || f >= 1.)
146: error("tanh D");
147: f = log((1.+f)/(1.-f))/2.;
148: goto ret;
149:
150: case -6:
151: /* arc cosh */
152: f = d2;
153: if(f < 1.)
154: error("cosh D");
155: f = log(f+sqrt(f*f-1.));
156: goto ret;
157:
158: case -5:
159: /* arc sinh */
160: f = d2;
161: f = log(f+sqrt(f*f+1.));
162: goto ret;
163:
164: case -4:
165: /* sqrt(-1 + x*x) */
166: f = -one + d2*d2;
167: goto sq;
168:
169: case -3:
170: /* arc tan */
171: f = d2;
172: f = atan(f);
173: goto ret;
174:
175: case -2:
176: /* arc cos */
177: f = d2;
178: if(f < -1. || f > 1.)
179: error("arc cos D");
180: f = atan2(sqrt(1.-f*f), f);
181: goto ret;
182:
183: case -1:
184: /* arc sin */
185: f = d2;
186: if(f < -1. || f > 1.)
187: error("arc sin D");
188: f = atan2(f, sqrt(1.-f*f));
189: goto ret;
190:
191: case 0:
192: /* sqrt(1 - x*x) */
193: f = one - d2*d2;
194: goto sq;
195:
196: case 1:
197: /* sin */
198: f = d2;
199: f = sin(f);
200: goto ret;
201:
202: case 2:
203: /* cos */
204: f = d2;
205: f = cos(f);
206: goto ret;
207:
208: case 3:
209: /* tan */
210: f = d2;
211: f1 = cos(f);
212: if(f1 == 0.)
213: f = exp(maxexp); else
214: f = sin(f)/f1;
215: goto ret;
216:
217: case 4:
218: /* sqrt(1 + x*x) */
219: f = one + d2*d2;
220: goto sq;
221:
222: case 5:
223: /* sinh */
224: f = d2;
225: if(f < -maxexp || f > maxexp)
226: error("sinh D");
227: f = exp(f);
228: f = (f-1./f)/2.;
229: goto ret;
230:
231: case 6:
232: /* cosh */
233: f = d2;
234: if(f < -maxexp || f > maxexp)
235: error("cosh D");
236: f = exp(f);
237: f = (f+1./f)/2.;
238: goto ret;
239:
240: case 7:
241: /* tanh */
242: f = d2;
243: if(f > maxexp) {
244: f = 1.;
245: goto ret;
246: }
247: if(f < -maxexp) {
248: f = -1.;
249: goto ret;
250: }
251: f = exp(f);
252: f = (f-1./f)/(f+1./f);
253: goto ret;
254: }
255:
256: sq:
257: if(f < 0.)
258: error("sqrt D");
259: f = sqrt(f);
260:
261: ret:
262: d1 = f;
263: return(d1);
264: }
265:
266: data
267: ex_comb(d1, d2)
268: data d1, d2;
269: {
270: double f;
271:
272: if(d1 > d2)
273: return(zero);
274: f = gamma(d2+1.) - gamma(d1+1.) - gamma(d2-d1+1.);
275: if(f > maxexp)
276: error("comb D");
277: d1 = exp(f);
278: return(d1);
279: }
280:
281: data
282: ex_and(d1, d2)
283: data d1, d2;
284: {
285:
286: if(d1!=zero && d2!=zero)
287: return(one);
288: return(zero);
289: }
290:
291: data
292: ex_or(d1, d2)
293: data d1, d2;
294: {
295:
296: if(d1!=zero || d2!=zero)
297: return(one);
298: return(zero);
299: }
300:
301: data
302: ex_nand(d1, d2)
303: data d1, d2;
304: {
305:
306: if(d1!=zero && d2!=zero)
307: return(zero);
308: return(one);
309: }
310:
311: data
312: ex_nor(d1, d2)
313: data d1, d2;
314: {
315:
316: if(d1!=zero || d2!=zero)
317: return(zero);
318: return(one);
319: }
320:
321: data
322: ex_lt(d1, d2)
323: data d1, d2;
324: {
325:
326: if(fuzz(d1, d2) < 0)
327: return(one);
328: return(zero);
329: }
330:
331: data
332: ex_le(d1, d2)
333: data d1, d2;
334: {
335:
336: if(fuzz(d1, d2) <= 0)
337: return(one);
338: return(zero);
339: }
340:
341: data
342: ex_eq(d1, d2)
343: data d1, d2;
344: {
345:
346: if(fuzz(d1, d2) == 0)
347: return(one);
348: return(zero);
349: }
350:
351: data
352: ex_ge(d1, d2)
353: data d1, d2;
354: {
355:
356: if(fuzz(d1, d2) >= 0)
357: return(one);
358: return(zero);
359: }
360:
361: data
362: ex_gt(d1, d2)
363: data d1, d2;
364: {
365:
366: if(fuzz(d1, d2) > 0)
367: return(one);
368: return(zero);
369: }
370:
371: data
372: ex_ne(d1, d2)
373: data d1, d2;
374: {
375:
376: if(fuzz(d1, d2) != 0)
377: return(one);
378: return(zero);
379: }
380:
381: data
382: ex_plus(d)
383: data d;
384: {
385:
386: return(d);
387: }
388:
389: data
390: ex_minus(d)
391: data d;
392: {
393:
394: return(-d);
395: }
396:
397: data
398: ex_sgn(d)
399: data d;
400: {
401:
402: if(d == zero)
403: return(zero);
404: if(d < zero)
405: return(-one);
406: return(one);
407: }
408:
409: data
410: ex_recip(d)
411: data d;
412: {
413:
414: if(d == zero)
415: error("recip D");
416: return(one/d);
417: }
418:
419: data
420: ex_abs(d)
421: data d;
422: {
423:
424: if(d < zero)
425: return(-d);
426: return(d);
427: }
428:
429: data
430: ex_floor(d)
431: data d;
432: {
433:
434: d = floor(d + thread.fuzz);
435: return(d);
436: }
437:
438: data
439: ex_ceil(d)
440: data d;
441: {
442:
443: d = ceil(d - thread.fuzz);
444: return(d);
445: }
446:
447: data
448: ex_exp(d)
449: data d;
450: {
451: double f;
452:
453: f = d;
454: if(f > maxexp)
455: error ("exp D");
456: d = exp(f);
457: return(d);
458: }
459:
460: data
461: ex_loge(d)
462: data d;
463: {
464: double f;
465:
466: f = d;
467: if(f <= 0.)
468: error("log D");
469: d = log(f);
470: return(d);
471: }
472:
473: data
474: ex_pi(d)
475: data d;
476: {
477:
478: d = pi * d;
479: return(d);
480: }
481:
482: /* ex_rand has been moved to af.c (with ex_deal) */
483:
484: data
485: ex_fac(d)
486: data d;
487: {
488: double f;
489:
490: f = gamma(d+1.);
491: if(f > maxexp)
492: error("fac D");
493: d = exp(f);
494: if(signgam < 0) /* if (signgam) in version 6 */
495: d = -d;
496: return(d);
497: }
498:
499: data
500: ex_not(d)
501: data d;
502: {
503:
504: if(d == zero)
505: return(one);
506: return(zero);
507: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.