(root)/
gcc-13.2.0/
libquadmath/
math/
exp2q.c
       1  /* Compute 2^x.
       2     Copyright (C) 2012-2018 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       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.
       9  
      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.
      14  
      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/>.  */
      18  
      19  #include "quadmath-imp.h"
      20  
      21  __float128
      22  exp2q (__float128 x)
      23  {
      24    if (__glibc_likely (__builtin_isless (x, (__float128) FLT128_MAX_EXP)))
      25      {
      26        if (__builtin_expect (__builtin_isgreaterequal (x, (__float128) (FLT128_MIN_EXP - FLT128_MANT_DIG
      27  							- 1)), 1))
      28  	{
      29  	  int intx = (int) x;
      30  	  __float128 fractx = x - intx;
      31  	  __float128 result;
      32  	  if (fabsq (fractx) < FLT128_EPSILON / 4)
      33  	    result = scalbnq (1 + fractx, intx);
      34  	  else
      35  	    result = scalbnq (expq (M_LN2q * fractx), intx);
      36  	  math_check_force_underflow_nonneg (result);
      37  	  return result;
      38  	}
      39        else
      40  	{
      41  	  /* Underflow or exact zero.  */
      42  	  if (isinfq (x))
      43  	    return 0;
      44  	  else
      45  	    return FLT128_MIN * FLT128_MIN;
      46  	}
      47      }
      48    else
      49      /* Infinity, NaN or overflow.  */
      50      return FLT128_MAX * x;
      51  }