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