|
|
1.1 root 1: /*
2: * libm/pow.c
3: * Raise x to the power y.
4: */
5:
6: #include <math.h>
7:
8: #if EMU87
9: #include "emumath.h"
10: #endif
11:
12: double
13: pow(x, y)
14: double x, y;
15: {
16: double r;
17: register unsigned s, i, e;
18:
19: s = 0;
20: i = 0;
21: if (x == 0.0) {
22: if (y <= 0.0)
23: errno = EDOM;
24: return 0.0;
25: }
26: if ((r = modf(y, &r)) < 0.0)
27: r += 1.0;
28: if (x < 0.0) {
29: if (r != 0.0) {
30: errno = EDOM;
31: return 0.0;
32: }
33: x = -x;
34: if (((int) y) & 1)
35: s = 1;
36: }
37: if (y < 0.0) {
38: y = -y;
39: i = 1;
40: }
41: if (r!=0.0 || y>16384.0)
42: r = _two(y*log10(x)*LOG10B2);
43: else {
44: r = 1.0;
45: for (e=y; e; e>>=1) {
46: if (e&01)
47: r *= x;
48: x *= x;
49: }
50: }
51: if (i)
52: r = 1/r;
53: return s ? -r : r;
54: }
55:
56: /* end of libm/pow.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.