(root)/
glibc-2.38/
sysdeps/
ieee754/
flt-32/
s_asinhf.c
       1  /* s_asinhf.c -- float version of s_asinh.c.
       2   */
       3  
       4  /*
       5   * ====================================================
       6   * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
       7   *
       8   * Developed at SunPro, a Sun Microsystems, Inc. business.
       9   * Permission to use, copy, modify, and distribute this
      10   * software is freely granted, provided that this notice
      11   * is preserved.
      12   * ====================================================
      13   */
      14  
      15  #include <float.h>
      16  #include <math.h>
      17  #include <math_private.h>
      18  #include <math-underflow.h>
      19  #include <libm-alias-float.h>
      20  
      21  static const float
      22  one =  1.0000000000e+00, /* 0x3F800000 */
      23  ln2 =  6.9314718246e-01, /* 0x3f317218 */
      24  huge=  1.0000000000e+30;
      25  
      26  float
      27  __asinhf(float x)
      28  {
      29  	float w;
      30  	int32_t hx,ix;
      31  	GET_FLOAT_WORD(hx,x);
      32  	ix = hx&0x7fffffff;
      33  	if(__builtin_expect(ix< 0x38000000, 0)) {	/* |x|<2**-14 */
      34  	    math_check_force_underflow (x);
      35  	    if(huge+x>one) return x;	/* return x inexact except 0 */
      36  	}
      37  	if(__builtin_expect(ix>0x47000000, 0)) {	/* |x| > 2**14 */
      38  	    if(ix>=0x7f800000) return x+x;	/* x is inf or NaN */
      39  	    w = __ieee754_logf(fabsf(x))+ln2;
      40  	} else {
      41  	    float xa = fabsf(x);
      42  	    if (ix>0x40000000) {	/* 2**14 > |x| > 2.0 */
      43  		w = __ieee754_logf(2.0f*xa+one/(sqrtf(xa*xa+one)+xa));
      44  	    } else {		/* 2.0 > |x| > 2**-14 */
      45  		float t = xa*xa;
      46  		w =__log1pf(xa+t/(one+sqrtf(one+t)));
      47  	    }
      48  	}
      49  	return copysignf(w, x);
      50  }
      51  libm_alias_float (__asinh, asinh)