summaryrefslogtreecommitdiff
path: root/math/octave-devel/files/patch-liboctave+log2
blob: 77160c637e348ecb7540f3a0a6483e19ce5db478 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
implimentation of log2 was taken from here
http://www.freebsd.org/cgi/cvsweb.cgi/ports/graphics/inkscape/files/patch-src_trace_potrace_inkscape-potrace.cpp
http://www.freebsd.org/cgi/query-pr.cgi?pr=83845

--- liboctave/CmplxDET.cc.orig	Thu Mar  2 12:40:01 2006
+++ liboctave/CmplxDET.cc	Tue Jul  4 21:10:43 2006
@@ -33,6 +33,8 @@
 #include "lo-mappers.h"
 #include "oct-cmplx.h"
 
+#include "log2.h"
+
 bool
 ComplexDET::value_will_overflow (void) const
 {
--- liboctave/dbleDET.cc.orig	Thu Jul 27 02:19:10 2006
+++ liboctave/dbleDET.cc	Thu Aug 31 16:05:44 2006
@@ -29,6 +29,7 @@
 #include <cmath>
 
 #include "dbleDET.h"
+#include "log2.h"
 #include "lo-mappers.h"
 
 bool
@@ -64,7 +65,7 @@
 {
   if (c10 != 0.0)
     {
-      double etmp = e10 / log10 (2);
+      double etmp = e10 /  __builtin_log10 (2);
       e2 = static_cast<int> (xround (etmp));
       etmp -= e2;
       c2 = c10 * xexp2 (etmp);
--- /dev/null	Tue Jul  4 21:11:00 2006
+++ liboctave/log2.h	Tue Jul  4 21:09:55 2006
@@ -0,0 +1,118 @@
+#ifndef log2
+static const double
+ln2 = 0.6931471805599452862268,
+two54   =  1.80143985094819840000e+16,  /* 43500000 00000000 */
+Lg1 = 6.666666666666735130e-01,  /* 3FE55555 55555593 */
+Lg2 = 3.999999999940941908e-01,  /* 3FD99999 9997FA04 */
+Lg3 = 2.857142874366239149e-01,  /* 3FD24924 94229359 */
+Lg4 = 2.222219843214978396e-01,  /* 3FCC71C5 1D8E78AF */
+Lg5 = 1.818357216161805012e-01,  /* 3FC74664 96CB03DE */
+Lg6 = 1.531383769920937332e-01,  /* 3FC39A09 D078C69F */
+Lg7 = 1.479819860511658591e-01;  /* 3FC2F112 DF3E5244 */
+
+static const double zero = 0.0;
+
+#if BYTE_ORDER == BIG_ENDIAN
+
+typedef union
+{
+      double value;
+        struct
+	      {
+		      u_int32_t msw;
+		          u_int32_t lsw;
+			    } parts;
+} ieee_double_shape_type;
+
+#endif
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+
+typedef union
+{
+      double value;
+        struct
+	      {
+		      u_int32_t lsw;
+		          u_int32_t msw;
+			    } parts;
+} ieee_double_shape_type;
+
+#endif
+
+#define EXTRACT_WORDS(ix0,ix1,d)                                \
+    do {                                                            \
+	  ieee_double_shape_type ew_u;                                  \
+	  ew_u.value = (d);                                             \
+	  (ix0) = ew_u.parts.msw;                                       \
+	  (ix1) = ew_u.parts.lsw;                                       \
+    } while (0)
+
+#define GET_HIGH_WORD(i,d)                                      \
+    do {                                                            \
+	  ieee_double_shape_type gh_u;                                  \
+	  gh_u.value = (d);                                             \
+	  (i) = gh_u.parts.msw;                                         \
+    } while (0)
+
+#define SET_HIGH_WORD(d,v)                                      \
+    do {                                                            \
+	  ieee_double_shape_type sh_u;                                  \
+	  sh_u.value = (d);                                             \
+	  sh_u.parts.msw = (v);                                         \
+	  (d) = sh_u.value;                                             \
+    } while (0)
+
+static double
+_log2(double x)
+{
+    double hfsq,f,s,z,R,w,t1,t2,dk;
+    int32_t k,hx,i,j;
+    u_int32_t lx;
+
+    EXTRACT_WORDS(hx,lx,x);
+
+    k=0;
+    if (hx < 0x00100000) {			/* x < 2**-1022  */
+	if (((hx&0x7fffffff)|lx)==0) 
+	    return -two54/zero;		/* log(+-0)=-inf */
+	if (hx<0) return (x-x)/zero;	/* log(-#) = NaN */
+	k -= 54; x *= two54; /* subnormal number, scale up x */
+	GET_HIGH_WORD(hx,x);
+    }
+    if (hx >= 0x7ff00000) return x+x;
+    k += (hx>>20)-1023;
+    hx &= 0x000fffff;
+    i = (hx+0x95f64)&0x100000;
+    SET_HIGH_WORD(x,hx|(i^0x3ff00000));	/* normalize x or x/2 */
+    k += (i>>20);
+    f = x-1.0;
+    dk = (double)k;
+    if((0x000fffff&(2+hx))<3) {	/* |f| < 2**-20 */
+	if (f==zero)
+	    return (dk);
+	R = f*f*(0.5-0.33333333333333333*f);
+	return (dk-(R-f)/ln2);
+    }
+    s = f/(2.0+f);
+    z = s*s;
+    i = hx-0x6147a;
+    w = z*z;
+    j = 0x6b851-hx;
+    t1= w*(Lg2+w*(Lg4+w*Lg6));
+    t2= z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7)));
+    i |= j;
+    R = t2+t1;
+    if(i>0) {
+	hfsq=0.5*f*f;
+	return (dk-(hfsq-s*(hfsq+R)-f)/ln2);
+    } else
+	return (dk-((s*(f-R))-f)/ln2);
+}
+
+#define log2(x) _log2(x)
+#endif
+
+ 
+ 
+ 
k