diff options
Diffstat (limited to 'math/octave-devel/files/patch-liboctave+log2')
-rw-r--r-- | math/octave-devel/files/patch-liboctave+log2 | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/math/octave-devel/files/patch-liboctave+log2 b/math/octave-devel/files/patch-liboctave+log2 new file mode 100644 index 000000000000..77160c637e34 --- /dev/null +++ b/math/octave-devel/files/patch-liboctave+log2 @@ -0,0 +1,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
\ No newline at end of file |