1 /* Implement __kernel_standard_l.
2 Copyright (C) 2012-2015 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>
39 static double zero
= 0.0;
41 /* Handle errors for a libm function as specified by TYPE (see
42 comments in k_standard.c for details), with arguments X and Y,
43 returning the appropriate return value for that function. */
46 __kernel_standard_l (long double x
, long double y
, int type
)
53 long double ax
= fabsl (x
);
55 dx
= __copysignl (DBL_MAX
, x
);
56 else if (ax
> 0 && ax
< DBL_MIN
)
57 dx
= __copysignl (DBL_MIN
, x
);
65 long double ay
= fabsl (y
);
67 dy
= __copysignl (DBL_MAX
, y
);
68 else if (ay
> 0 && ay
< DBL_MIN
)
69 dy
= __copysignl (DBL_MIN
, y
);
79 /* powl (x, y) overflow. */
83 exc
.name
= (char *) "powl";
84 if (_LIB_VERSION
== _SVID_
)
88 if (x
< zero
&& __rintl (y
) != y
)
93 exc
.retval
= HUGE_VAL
;
95 if (x
< zero
&& __rintl (y
) != y
)
96 exc
.retval
= -HUGE_VAL
;
98 if (_LIB_VERSION
== _POSIX_
)
100 else if (!matherr (&exc
))
101 __set_errno (ERANGE
);
105 /* powl (x, y) underflow. */
108 exc
.type
= UNDERFLOW
;
109 exc
.name
= (char *) "powl";
112 if (x
< zero
&& __rintl (y
) != y
)
114 if (_LIB_VERSION
== _POSIX_
)
115 __set_errno (ERANGE
);
116 else if (!matherr (&exc
))
117 __set_errno (ERANGE
);
121 return __kernel_standard (dx
, dy
, type
);