(root)/
glibc-2.38/
sysdeps/
ieee754/
flt-32/
e_log10f.c
       1  /* e_log10f.c -- float version of e_log10.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 <math.h>
      16  #include <math_private.h>
      17  #include <fix-int-fp-convert-zero.h>
      18  #include <libm-alias-finite.h>
      19  
      20  static const float
      21  two25      =  3.3554432000e+07, /* 0x4c000000 */
      22  ivln10     =  4.3429449201e-01, /* 0x3ede5bd9 */
      23  log10_2hi  =  3.0102920532e-01, /* 0x3e9a2080 */
      24  log10_2lo  =  7.9034151668e-07; /* 0x355427db */
      25  
      26  float
      27  __ieee754_log10f(float x)
      28  {
      29  	float y,z;
      30  	int32_t i,k,hx;
      31  
      32  	GET_FLOAT_WORD(hx,x);
      33  
      34  	k=0;
      35  	if (hx < 0x00800000) {			/* x < 2**-126  */
      36  	    if (__builtin_expect((hx&0x7fffffff)==0, 0))
      37  	      return -two25/fabsf (x);	/* log(+-0)=-inf  */
      38  	    if (__builtin_expect(hx<0, 0))
      39  		return (x-x)/(x-x);	/* log(-#) = NaN */
      40  	    k -= 25; x *= two25; /* subnormal number, scale up x */
      41  	    GET_FLOAT_WORD(hx,x);
      42  	}
      43  	if (__builtin_expect(hx >= 0x7f800000, 0)) return x+x;
      44  	k += (hx>>23)-127;
      45  	i  = ((uint32_t)k&0x80000000)>>31;
      46  	hx = (hx&0x007fffff)|((0x7f-i)<<23);
      47  	y  = (float)(k+i);
      48  	if (FIX_INT_FP_CONVERT_ZERO && y == 0.0f)
      49  	  y = 0.0f;
      50  	SET_FLOAT_WORD(x,hx);
      51  	z  = y*log10_2lo + ivln10*__ieee754_logf(x);
      52  	return  z+y*log10_2hi;
      53  }
      54  libm_alias_finite (__ieee754_log10f, __log10f)