xref: /csrg-svn/old/libm/liboldnm/pow.c (revision 20003)
1*20003Sdist /*
2*20003Sdist 	computes a^b.
3*20003Sdist 	uses log and exp
4*20003Sdist */
5*20003Sdist 
6*20003Sdist #include	<errno.h>
7*20003Sdist int errno;
8*20003Sdist double log(), exp();
9*20003Sdist 
10*20003Sdist double
11*20003Sdist pow(arg1,arg2)
12*20003Sdist double arg1, arg2;
13*20003Sdist {
14*20003Sdist 	double temp;
15*20003Sdist 	long l;
16*20003Sdist 
17*20003Sdist 	asm("	bispsw	$0xe0");
18*20003Sdist 	if(arg1 <= 0.) {
19*20003Sdist 		if(arg1 == 0.) {
20*20003Sdist 			if(arg2 <= 0.)
21*20003Sdist 				goto domain;
22*20003Sdist 			return(0.);
23*20003Sdist 		}
24*20003Sdist 		l = arg2;
25*20003Sdist 		if(l != arg2)
26*20003Sdist 			goto domain;
27*20003Sdist 		temp = exp(arg2 * log(-arg1));
28*20003Sdist 		if(l & 1)
29*20003Sdist 			temp = -temp;
30*20003Sdist 		return(temp);
31*20003Sdist 	}
32*20003Sdist 	return(exp(arg2 * log(arg1)));
33*20003Sdist 
34*20003Sdist domain:
35*20003Sdist 	errno = EDOM;
36*20003Sdist 	return(0.);
37*20003Sdist }
38