s_logb.c revision 1.1 1
2 /* @(#)s_logb.c 5.1 93/09/24 */
3 /*
4 * ====================================================
5 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
6 *
7 * Developed at SunPro, a Sun Microsystems, Inc. business.
8 * Permission to use, copy, modify, and distribute this
9 * software is freely granted, provided that this notice
10 * is preserved.
11 * ====================================================
12 */
13
14 /*
15 * double logb(x)
16 * IEEE 754 logb. Included to pass IEEE test suite. Not recommend.
17 * Use ilogb instead.
18 */
19
20 #include "fdlibm.h"
21
22 #ifdef __STDC__
23 static const double one = 1.0;
24 #else
25 static double one = 1.0;
26 #endif
27
28 #ifdef __STDC__
29 double logb(double x)
30 #else
31 double logb(x)
32 double x;
33 #endif
34 {
35 int n0,lx,ix;
36 n0 = ((*(int*)&one)>>29)^1;
37 ix = (*(n0+(int*)&x))&0x7fffffff; /* high |x| */
38 lx = *(1-n0+(int*)&x); /* low x */
39 if((ix|lx)==0) return -1.0/fabs(x);
40 if(ix>=0x7ff00000) return x*x;
41 if((ix>>=20)==0) /* IEEE 754 logb */
42 return -1022.0;
43 else
44 return (double) (ix-1023);
45 }
46