1 /* Implement __kernel_standard_l.
2 Copyright (C) 2012-2016 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
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.
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.
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/>.
19 Parts based on k_standard.c from fdlibm: */
21 /* @(#)k_standard.c 5.1 93/09/24 */
23 * ====================================================
24 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
26 * Developed at SunPro, a Sun Microsystems, Inc. business.
27 * Permission to use, copy, modify, and distribute this
28 * software is freely granted, provided that this notice
30 * ====================================================
34 #include "math_private.h"
40 static double zero
= 0.0;
42 /* Handle errors for a libm function as specified by TYPE (see
43 comments in k_standard.c for details), with arguments X and Y,
44 returning the appropriate return value for that function. */
47 __kernel_standard_l (long double x
, long double y
, int type
)
63 /* powl (x, y) overflow. */
67 exc
.name
= (char *) "powl";
68 if (_LIB_VERSION
== _SVID_
)
72 if (x
< zero
&& rint (y
) != y
)
77 exc
.retval
= HUGE_VAL
;
79 if (x
< zero
&& rint (y
) != y
)
80 exc
.retval
= -HUGE_VAL
;
82 if (_LIB_VERSION
== _POSIX_
)
84 else if (!matherr (&exc
))
89 /* powl (x, y) underflow. */
93 exc
.name
= (char *) "powl";
96 if (x
< zero
&& rint (y
) != y
)
98 if (_LIB_VERSION
== _POSIX_
)
100 else if (!matherr (&exc
))
101 __set_errno (ERANGE
);
105 return __kernel_standard (dx
, dy
, type
);