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