home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 Mobile / Chip_Mobile_2001.iso / palm / hobby / palmoon / palmoon.EXE / s_ilogb.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-10-05  |  1.4 KB  |  57 lines

  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) = 0x80000001
  20.  * ilogb(inf/NaN) = 0x7fffffff (no signal is raised)
  21.  */
  22.  
  23. #include "math.h"
  24. #include "math_private.h"
  25.  
  26. #ifdef __STDC__
  27.     int __ilogb(double x)
  28. #else
  29.     int __ilogb(x)
  30.     double x;
  31. #endif
  32. {
  33.     int32_t hx,lx,ix;
  34.  
  35.     GET_HIGH_WORD(hx,x);
  36.     hx &= 0x7fffffff;
  37.     if(hx<0x00100000) {
  38.         GET_LOW_WORD(lx,x);
  39.         if((hx|lx)==0)
  40.         return 0x80000001;    /* ilogb(0) = 0x80000001 */
  41.         else            /* subnormal x */
  42.         if(hx==0) {
  43.             for (ix = -1043; lx>0; lx<<=1) ix -=1;
  44.         } else {
  45.             for (ix = -1022,hx<<=11; hx>0; hx<<=1) ix -=1;
  46.         }
  47.         return ix;
  48.     }
  49.     else if (hx<0x7ff00000) return (hx>>20)-1023;
  50.     else return 0x7fffffff;
  51. }
  52. weak_alias (__ilogb, ilogb)
  53. #ifdef NO_LONG_DOUBLE
  54. strong_alias (__ilogb, __ilogbl)
  55. weak_alias (__ilogb, ilogbl)
  56. #endif
  57.