]>
Commit | Line | Data |
---|---|---|
0ac5ae23 UD |
1 | /* Copyright (C) 2011 Free Software Foundation, Inc. |
2 | This file is part of the GNU C Library. | |
3 | Contributed by Ulrich Drepper <drepper@gmail.com>, 2011. | |
f7eac6eb | 4 | |
0ac5ae23 UD |
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. | |
f7eac6eb | 9 | |
0ac5ae23 UD |
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. | |
f7eac6eb | 14 | |
0ac5ae23 UD |
15 | You should have received a copy of the GNU Lesser General Public |
16 | License along with the GNU C Library; if not, write to the Free | |
17 | Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | |
18 | 02111-1307 USA. */ | |
f7eac6eb | 19 | |
9d13fb24 | 20 | #include <math.h> |
9277c064 | 21 | #include <math_private.h> |
f7eac6eb RM |
22 | |
23 | ||
0ac5ae23 UD |
24 | /* wrapper pow */ |
25 | double | |
26 | __pow (double x, double y) | |
f7eac6eb | 27 | { |
0ac5ae23 UD |
28 | double z = __ieee754_pow (x, y); |
29 | if (__builtin_expect (!__finite (z), 0)) | |
30 | { | |
31 | if (_LIB_VERSION != _IEEE_) | |
32 | { | |
33 | if (__isnan (x)) | |
34 | { | |
35 | if (y == 0.0) | |
36 | /* pow(NaN,0.0) */ | |
37 | return __kernel_standard (x, y, 42); | |
38 | } | |
39 | else if (__finite (x) && __finite (y)) | |
40 | { | |
41 | if (__isnan (z)) | |
42 | /* pow neg**non-int */ | |
43 | return __kernel_standard (x, y, 24); | |
44 | else if (x == 0.0 && y < 0.0) | |
45 | { | |
46 | if (signbit (x) && signbit (z)) | |
47 | /* pow(-0.0,negative) */ | |
48 | return __kernel_standard (x, y, 23); | |
49 | else | |
50 | /* pow(+0.0,negative) */ | |
51 | return __kernel_standard (x, y, 43); | |
52 | } | |
0d8733c4 | 53 | else |
0ac5ae23 UD |
54 | /* pow overflow */ |
55 | return __kernel_standard (x, y, 21); | |
7ef90c15 | 56 | } |
f7eac6eb | 57 | } |
0ac5ae23 UD |
58 | } |
59 | else if (__builtin_expect (z == 0.0, 0) && __finite (x) && __finite (y) | |
60 | && _LIB_VERSION != _IEEE_) | |
61 | { | |
62 | if (x == 0.0) | |
63 | { | |
64 | if (y == 0.0) | |
65 | /* pow(0.0,0.0) */ | |
66 | return __kernel_standard (x, y, 20); | |
cccda09f | 67 | } |
0ac5ae23 UD |
68 | else |
69 | /* pow underflow */ | |
70 | return __kernel_standard (x, y, 22); | |
71 | } | |
72 | ||
73 | return z; | |
f7eac6eb RM |
74 | } |
75 | weak_alias (__pow, pow) | |
cccda09f UD |
76 | #ifdef NO_LONG_DOUBLE |
77 | strong_alias (__pow, __powl) | |
78 | weak_alias (__pow, powl) | |
79 | #endif |