(root)/
glibc-2.38/
math/
w_powf_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-float.h>
      22  
      23  
      24  #if LIBM_SVID_COMPAT && SHLIB_COMPAT (libm, GLIBC_2_0, GLIBC_2_27)
      25  /* wrapper powf */
      26  float
      27  __powf_compat (float x, float y)
      28  {
      29    float z = __ieee754_powf (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_f (x, y, 124);
      39  	      else if (x == 0.0f && y < 0.0f)
      40  		{
      41  		  if (signbit (x) && signbit (z))
      42  		    /* pow(-0.0,negative) */
      43  		    return __kernel_standard_f (x, y, 123);
      44  		  else
      45  		    /* pow(+0.0,negative) */
      46  		    return __kernel_standard_f (x, y, 143);
      47  		}
      48  	      else
      49  		/* pow overflow */
      50  		return __kernel_standard_f (x, y, 121);
      51  	    }
      52  	}
      53      }
      54    else if (__builtin_expect (z == 0.0f, 0)
      55  	   && isfinite (x) && x != 0 && isfinite (y)
      56  	   && _LIB_VERSION != _IEEE_)
      57      /* pow underflow */
      58      return __kernel_standard_f (x, y, 122);
      59  
      60    return z;
      61  }
      62  compat_symbol (libm, __powf_compat, powf, GLIBC_2_0);
      63  #endif