(root)/
glibc-2.38/
sysdeps/
ieee754/
dbl-64/
e_ilogb.c
       1  /* @(#)s_ilogb.c 5.1 93/09/24 */
       2  /*
       3   * ====================================================
       4   * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
       5   *
       6   * Developed at SunPro, a Sun Microsystems, Inc. business.
       7   * Permission to use, copy, modify, and distribute this
       8   * software is freely granted, provided that this notice
       9   * is preserved.
      10   * ====================================================
      11   */
      12  
      13  #if defined(LIBM_SCCS) && !defined(lint)
      14  static char rcsid[] = "$NetBSD: s_ilogb.c,v 1.9 1995/05/10 20:47:28 jtc Exp $";
      15  #endif
      16  
      17  /* ilogb(double x)
      18   * return the binary exponent of non-zero x
      19   * ilogb(0) = FP_ILOGB0
      20   * ilogb(NaN) = FP_ILOGBNAN (no signal is raised)
      21   * ilogb(+-Inf) = INT_MAX (no signal is raised)
      22   */
      23  
      24  #include <limits.h>
      25  #include <math.h>
      26  #include <math_private.h>
      27  
      28  int
      29  __ieee754_ilogb (double x)
      30  {
      31    int32_t hx, lx, ix;
      32  
      33    GET_HIGH_WORD (hx, x);
      34    hx &= 0x7fffffff;
      35    if (hx < 0x00100000)
      36      {
      37        GET_LOW_WORD (lx, x);
      38        if ((hx | lx) == 0)
      39  	return FP_ILOGB0;               /* ilogb(0) = FP_ILOGB0 */
      40        else                              /* subnormal x */
      41        if (hx == 0)
      42  	{
      43  	  for (ix = -1043; lx > 0; lx <<= 1)
      44  	    ix -= 1;
      45  	}
      46        else
      47  	{
      48  	  for (ix = -1022, hx <<= 11; hx > 0; hx <<= 1)
      49  	    ix -= 1;
      50  	}
      51        return ix;
      52      }
      53    else if (hx < 0x7ff00000)
      54      return (hx >> 20) - 1023;
      55    else if (FP_ILOGBNAN != INT_MAX)
      56      {
      57        /* ISO C99 requires ilogb(+-Inf) == INT_MAX.  */
      58        GET_LOW_WORD (lx, x);
      59        if (((hx ^ 0x7ff00000) | lx) == 0)
      60  	return INT_MAX;
      61      }
      62    return FP_ILOGBNAN;
      63  }