SDL  2.0
e_log10.c
Go to the documentation of this file.
1 /*
2  * ====================================================
3  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
4  *
5  * Developed at SunPro, a Sun Microsystems, Inc. business.
6  * Permission to use, copy, modify, and distribute this
7  * software is freely granted, provided that this notice
8  * is preserved.
9  * ====================================================
10  */
11 
12 #if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */
13 /* C4723: potential divide by zero. */
14 #pragma warning ( disable : 4723 )
15 #endif
16 
17 /* __ieee754_log10(x)
18  * Return the base 10 logarithm of x
19  *
20  * Method :
21  * Let log10_2hi = leading 40 bits of log10(2) and
22  * log10_2lo = log10(2) - log10_2hi,
23  * ivln10 = 1/log(10) rounded.
24  * Then
25  * n = ilogb(x),
26  * if(n<0) n = n+1;
27  * x = scalbn(x,-n);
28  * log10(x) := n*log10_2hi + (n*log10_2lo + ivln10*log(x))
29  *
30  * Note 1:
31  * To guarantee log10(10**n)=n, where 10**n is normal, the rounding
32  * mode must set to Round-to-Nearest.
33  * Note 2:
34  * [1/log(10)] rounded to 53 bits has error .198 ulps;
35  * log10 is monotonic at all binary break points.
36  *
37  * Special cases:
38  * log10(x) is NaN with signal if x < 0;
39  * log10(+INF) is +INF with no signal; log10(0) is -INF with signal;
40  * log10(NaN) is that NaN with no signal;
41  * log10(10**N) = N for N=0,1,...,22.
42  *
43  * Constants:
44  * The hexadecimal values are the intended ones for the following constants.
45  * The decimal values may be used, provided that the compiler will convert
46  * from decimal to binary accurately enough to produce the hexadecimal values
47  * shown.
48  */
49 
50 #include "math_libm.h"
51 #include "math_private.h"
52 
53 static const double
54 two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */
55 ivln10 = 4.34294481903251816668e-01, /* 0x3FDBCB7B, 0x1526E50E */
56 log10_2hi = 3.01029995663611771306e-01, /* 0x3FD34413, 0x509F6000 */
57 log10_2lo = 3.69423907715893078616e-13; /* 0x3D59FEF3, 0x11F12B36 */
58 
59 static const double zero = 0.0;
60 
62 {
63  double y,z;
64  int32_t i,k,hx;
65  u_int32_t lx;
66 
67  EXTRACT_WORDS(hx,lx,x);
68 
69  k=0;
70  if (hx < 0x00100000) { /* x < 2**-1022 */
71  if (((hx&0x7fffffff)|lx)==0)
72  return -two54/zero; /* log(+-0)=-inf */
73  if (hx<0) return (x-x)/zero; /* log(-#) = NaN */
74  k -= 54; x *= two54; /* subnormal number, scale up x */
75  GET_HIGH_WORD(hx,x);
76  }
77  if (hx >= 0x7ff00000) return x+x;
78  k += (hx>>20)-1023;
79  i = ((u_int32_t)k&0x80000000)>>31;
80  hx = (hx&0x000fffff)|((0x3ff-i)<<20);
81  y = (double)(k+i);
82  SET_HIGH_WORD(x,hx);
84  return z+y*log10_2hi;
85 }
86 
87 /*
88  * wrapper log10(X)
89  */
90 #ifndef _IEEE_LIBM
91 double log10(double x)
92 {
93  double z = __ieee754_log10(x);
94  if (_LIB_VERSION == _IEEE_ || isnan(x))
95  return z;
96  if (x <= 0.0) {
97  if(x == 0.0)
98  return __kernel_standard(x, x, 18); /* log10(0) */
99  return __kernel_standard(x, x, 19); /* log10(x<0) */
100  }
101  return z;
102 }
103 #else
105 #endif
106 libm_hidden_def(log10)
two54
static const double two54
Definition: e_log10.c:54
ivln10
static const double ivln10
Definition: e_log10.c:55
math_private.h
attribute_hidden
#define attribute_hidden
Definition: math_private.h:25
z
GLdouble GLdouble z
Definition: SDL_opengl_glext.h:407
log10_2hi
static const double log10_2hi
Definition: e_log10.c:56
EXTRACT_WORDS
#define EXTRACT_WORDS(ix0, ix1, d)
Definition: math_private.h:99
libm_hidden_def
libm_hidden_def(scalbln)
Definition: s_scalbn.c:66
SET_HIGH_WORD
#define SET_HIGH_WORD(d, v)
Definition: math_private.h:137
strong_alias
#define strong_alias(x, y)
Definition: math_private.h:28
log10_2lo
static const double log10_2lo
Definition: e_log10.c:57
math_libm.h
zero
static const double zero
Definition: e_log10.c:59
x
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1574
int32_t
signed int int32_t
Definition: SDL_config_windows.h:62
u_int32_t
unsigned int u_int32_t
Definition: math_private.h:31
__ieee754_log10
double attribute_hidden __ieee754_log10(double x)
Definition: e_log10.c:61
y
GLint GLint GLint GLint GLint GLint y
Definition: SDL_opengl.h:1574
k
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int int int return Display Window Cursor return Display Window return Display Drawable GC int int unsigned int unsigned int return Display Drawable GC int int _Xconst char int return Display Drawable GC int int unsigned int unsigned int return Display return Display Cursor return Display GC return XModifierKeymap return char Display Window int return Display return Display int int int return Display long XVisualInfo int return Display Window Atom long long Bool Atom Atom int unsigned long unsigned long k)
Definition: SDL_x11sym.h:80
GET_HIGH_WORD
#define GET_HIGH_WORD(i, d)
Definition: math_private.h:109
__ieee754_log
#define __ieee754_log
Definition: math_private.h:42
i
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50