Branch data Line data Source code
1 : : /* @(#)s_logb.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 : : #include "cdefs-compat.h"
14 : : //__FBSDID("$FreeBSD: src/lib/msun/src/s_logb.c,v 1.12 2008/02/08 01:22:13 bde Exp $");
15 : :
16 : : /*
17 : : * double logb(x)
18 : : * IEEE 754 logb. Included to pass IEEE test suite. Not recommend.
19 : : * Use ilogb instead.
20 : : */
21 : :
22 : : #include <float.h>
23 : : #include <openlibm_math.h>
24 : :
25 : : #include "math_private.h"
26 : :
27 : : static const double
28 : : two54 = 1.80143985094819840000e+16; /* 43500000 00000000 */
29 : :
30 : : OLM_DLLEXPORT double
31 : 9 : logb(double x)
32 : : {
33 : : int32_t lx,ix;
34 : 9 : EXTRACT_WORDS(ix,lx,x);
35 : 9 : ix &= 0x7fffffff; /* high |x| */
36 [ + + ]: 9 : if((ix|lx)==0) return -1.0/fabs(x);
37 [ + + ]: 7 : if(ix>=0x7ff00000) return x*x;
38 [ - + ]: 4 : if(ix<0x00100000) {
39 : 0 : x *= two54; /* convert subnormal x to normal */
40 : 0 : GET_HIGH_WORD(ix,x);
41 : 0 : ix &= 0x7fffffff;
42 : 0 : return (double) ((ix>>20)-1023-54);
43 : : } else
44 : 4 : return (double) ((ix>>20)-1023);
45 : : }
46 : :
47 : : #if (LDBL_MANT_DIG == 53)
48 : : openlibm_weak_reference(logb, logbl);
49 : : #endif
|