]>
Commit | Line | Data |
---|---|---|
f7eac6eb RM |
1 | /* w_powf.c -- float version of w_pow.c. |
2 | * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. | |
3 | */ | |
4 | ||
5 | /* | |
6 | * ==================================================== | |
7 | * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. | |
8 | * | |
9 | * Developed at SunPro, a Sun Microsystems, Inc. business. | |
10 | * Permission to use, copy, modify, and distribute this | |
0d8733c4 | 11 | * software is freely granted, provided that this notice |
f7eac6eb RM |
12 | * is preserved. |
13 | * ==================================================== | |
14 | */ | |
15 | ||
16 | #if defined(LIBM_SCCS) && !defined(lint) | |
17 | static char rcsid[] = "$NetBSD: w_powf.c,v 1.3 1995/05/10 20:49:41 jtc Exp $"; | |
18 | #endif | |
19 | ||
0d8733c4 | 20 | /* |
f7eac6eb RM |
21 | * wrapper powf(x,y) return x**y |
22 | */ | |
23 | ||
9d13fb24 | 24 | #include <math.h> |
9277c064 | 25 | #include <math_private.h> |
f7eac6eb RM |
26 | |
27 | ||
28 | #ifdef __STDC__ | |
29 | float __powf(float x, float y) /* wrapper powf */ | |
30 | #else | |
31 | float __powf(x,y) /* wrapper powf */ | |
32 | float x,y; | |
33 | #endif | |
34 | { | |
35 | #ifdef _IEEE_LIBM | |
36 | return __ieee754_powf(x,y); | |
37 | #else | |
38 | float z; | |
39 | z=__ieee754_powf(x,y); | |
40 | if(_LIB_VERSION == _IEEE_|| __isnanf(y)) return z; | |
41 | if(__isnanf(x)) { | |
0d8733c4 | 42 | if(y==(float)0.0) |
f7eac6eb RM |
43 | /* powf(NaN,0.0) */ |
44 | return (float)__kernel_standard((double)x,(double)y,142); | |
0d8733c4 | 45 | else |
f7eac6eb RM |
46 | return z; |
47 | } | |
7ef90c15 | 48 | if(x==(float)0.0) { |
f7eac6eb RM |
49 | if(y==(float)0.0) |
50 | /* powf(0.0,0.0) */ | |
51 | return (float)__kernel_standard((double)x,(double)y,120); | |
7ef90c15 | 52 | if(__finitef(y)&&y<(float)0.0) { |
0d8733c4 | 53 | if (signbit (x) && signbit (z)) |
f7eac6eb RM |
54 | /* powf(0.0,negative) */ |
55 | return (float)__kernel_standard((double)x,(double)y,123); | |
0d8733c4 UD |
56 | else |
57 | return (float)__kernel_standard((double)x,(double)y,143); | |
7ef90c15 | 58 | } |
f7eac6eb RM |
59 | return z; |
60 | } | |
61 | if(!__finitef(z)) { | |
62 | if(__finitef(x)&&__finitef(y)) { | |
63 | if(__isnanf(z)) | |
64 | /* powf neg**non-int */ | |
65 | return (float)__kernel_standard((double)x,(double)y,124); | |
0d8733c4 | 66 | else |
f7eac6eb RM |
67 | /* powf overflow */ |
68 | return (float)__kernel_standard((double)x,(double)y,121); | |
69 | } | |
0d8733c4 | 70 | } |
f7eac6eb RM |
71 | if(z==(float)0.0&&__finitef(x)&&__finitef(y)) |
72 | /* powf underflow */ | |
73 | return (float)__kernel_standard((double)x,(double)y,122); | |
74 | return z; | |
75 | #endif | |
76 | } | |
77 | weak_alias (__powf, powf) |