(root)/
glibc-2.38/
math/
w_powl_compat.c
       1  /* Copyright (C) 2011-2023 Free Software Foundation, Inc.
       2     This file is part of the GNU C Library.
       3  
       4     The GNU C Library is free software; you can redistribute it and/or
       5     modify it under the terms of the GNU Lesser General Public
       6     License as published by the Free Software Foundation; either
       7     version 2.1 of the License, or (at your option) any later version.
       8  
       9     The GNU C Library is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12     Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser General Public
      15     License along with the GNU C Library; if not, see
      16     <https://www.gnu.org/licenses/>.  */
      17  
      18  #include <math.h>
      19  #include <math_private.h>
      20  #include <math-svid-compat.h>
      21  #include <libm-alias-ldouble.h>
      22  
      23  
      24  #if LIBM_SVID_COMPAT
      25  /* wrapper powl */
      26  long double
      27  __powl (long double x, long double y)
      28  {
      29    long double z = __ieee754_powl (x, y);
      30    if (__glibc_unlikely (!isfinite (z)))
      31      {
      32        if (_LIB_VERSION != _IEEE_)
      33  	{
      34  	  if (isfinite (x) && isfinite (y))
      35  	    {
      36  	      if (isnan (z))
      37  		/* pow neg**non-int */
      38  		return __kernel_standard_l (x, y, 224);
      39  	      else if (x == 0.0L && y < 0.0L)
      40  		{
      41  		  if (signbit (x) && signbit (z))
      42  		    /* pow(-0.0,negative) */
      43  		    return __kernel_standard_l (x, y, 223);
      44  		  else
      45  		    /* pow(+0.0,negative) */
      46  		    return __kernel_standard_l (x, y, 243);
      47  		}
      48  	      else
      49  		/* pow overflow */
      50  		return __kernel_standard_l (x, y, 221);
      51  	    }
      52  	}
      53      }
      54    else if (__builtin_expect (z == 0.0L, 0)
      55  	   && isfinite (x) && x != 0 && isfinite (y)
      56  	   && _LIB_VERSION != _IEEE_)
      57      /* pow underflow */
      58      return __kernel_standard_l (x, y, 222);
      59  
      60    return z;
      61  }
      62  libm_alias_ldouble (__pow, pow)
      63  #endif