malloc/mtrace.c: Cosmetic cleanup.
[jlayton/glibc.git] / math / w_powf.c
1 /* Copyright (C) 2011-2014 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Ulrich Drepper <drepper@gmail.com>, 2011.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <http://www.gnu.org/licenses/>.  */
18
19 #include <math.h>
20 #include <math_private.h>
21
22
23 /* wrapper powf */
24 float
25 __powf (float x, float y)
26 {
27   float z = __ieee754_powf (x, y);
28   if (__glibc_unlikely (!__finitef (z)))
29     {
30       if (_LIB_VERSION != _IEEE_)
31         {
32           if (__isnanf (x))
33             {
34               if (y == 0.0f)
35                 /* pow(NaN,0.0) */
36                 return __kernel_standard_f (x, y, 142);
37             }
38           else if (__finitef (x) && __finitef (y))
39             {
40               if (__isnanf (z))
41                 /* pow neg**non-int */
42                 return __kernel_standard_f (x, y, 124);
43               else if (x == 0.0f && y < 0.0f)
44                 {
45                   if (signbit (x) && signbit (z))
46                     /* pow(-0.0,negative) */
47                     return __kernel_standard_f (x, y, 123);
48                   else
49                     /* pow(+0.0,negative) */
50                     return __kernel_standard_f (x, y, 143);
51                 }
52               else
53                 /* pow overflow */
54                 return __kernel_standard_f (x, y, 121);
55             }
56         }
57     }
58   else if (__builtin_expect (z == 0.0f, 0) && __finitef (x) && __finitef (y)
59            && _LIB_VERSION != _IEEE_)
60     {
61       if (x == 0.0f)
62         {
63           if (y == 0.0f)
64             /* pow(0.0,0.0) */
65             return __kernel_standard_f (x, y, 120);
66         }
67       else
68         /* pow underflow */
69         return __kernel_standard_f (x, y, 122);
70     }
71
72   return z;
73 }
74 weak_alias (__powf, powf)