]> git.mxchange.org Git - simgear.git/commitdiff
Remove fastmath funktions like discussed on the list.
authorfrohlich <frohlich>
Sun, 30 Jul 2006 07:48:06 +0000 (07:48 +0000)
committerfrohlich <frohlich>
Sun, 30 Jul 2006 07:48:06 +0000 (07:48 +0000)
Add a new header with forward declarations of the SGMath stuff.

15 files changed:
projects/VC8/SimGear.vcproj
simgear/math/Makefile.am
simgear/math/SGCMath.hxx [new file with mode: 0644]
simgear/math/SGGeodesy.hxx
simgear/math/SGLimits.hxx
simgear/math/SGMath.hxx
simgear/math/SGMathFwd.hxx [new file with mode: 0644]
simgear/math/SGMatrix.hxx
simgear/math/SGMisc.hxx
simgear/math/SGQuat.hxx
simgear/math/SGVec3.hxx
simgear/math/SGVec4.hxx
simgear/math/fastmath.cxx [deleted file]
simgear/math/fastmath.hxx [deleted file]
simgear/sound/xmlsound.cxx

index aaf6605681190a683abb350891710c027deea1f5..e351edc5a2004810d6ad4d3dbfb7d7338d156282 100755 (executable)
                                RelativePath="..\..\simgear\screen\extensions.hxx"\r
                                >\r
                        </File>\r
-                       <File\r
-                               RelativePath="..\..\simgear\math\fastmath.hxx"\r
-                               >\r
-                       </File>\r
                        <File\r
                                RelativePath="..\..\simgear\timing\geocoord.h"\r
                                >\r
                                RelativePath="..\..\simgear\math\SGMath.hxx"\r
                                >\r
                        </File>\r
+                       <File\r
+                               RelativePath="..\..\simgear\math\SGMathFwd.hxx"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\simgear\math\SGCMath.hxx"\r
+                               >\r
+                       </File>\r
                        <File\r
                                RelativePath="..\..\simgear\math\SGMatrix.hxx"\r
                                >\r
                                RelativePath="..\..\simgear\screen\extensions.cxx"\r
                                >\r
                        </File>\r
-                       <File\r
-                               RelativePath="..\..\simgear\math\fastmath.cxx"\r
-                               >\r
-                       </File>\r
                        <File\r
                                RelativePath="..\..\simgear\nasal\gc.c"\r
                                >\r
index f187496c843256b92cf60847d53a47939ae7c7d8..03d189a244a12d681473eb5a851a6da4003e4f36 100644 (file)
@@ -20,13 +20,14 @@ include_HEADERS = \
        sg_random.h \
        sg_types.hxx \
        vector.hxx \
-       fastmath.hxx \
+       SGCMath.hxx \
        SGGeoc.hxx \
        SGGeod.hxx \
        SGGeodesy.hxx \
        SGLimits.hxx \
        SGMatrix.hxx \
        SGMath.hxx \
+       SGMathFwd.hxx \
        SGMisc.hxx \
        SGQuat.hxx \
        SGVec4.hxx \
@@ -40,7 +41,6 @@ libsgmath_a_SOURCES = \
        sg_geodesy.cxx \
        sg_random.c \
        vector.cxx \
-       fastmath.cxx \
        SGGeodesy.cxx
 
 INCLUDES = -I$(top_srcdir)
diff --git a/simgear/math/SGCMath.hxx b/simgear/math/SGCMath.hxx
new file mode 100644 (file)
index 0000000..d6e2213
--- /dev/null
@@ -0,0 +1,31 @@
+// Copyright (C) 2006  Mathias Froehlich - Mathias.Froehlich@web.de
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Library General Public
+// License as published by the Free Software Foundation; either
+// version 2 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Library General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+//
+
+#ifndef SGCMath_H
+#define SGCMath_H
+
+#include <simgear/compiler.h>
+
+#ifdef SG_HAVE_STD_INCLUDES
+// We have cmath from the standard c++ lib available
+#include <cmath>
+#else
+// We only have math.h with the c89 double functions.
+#include <math.h>
+#endif
+
+#endif
index 8f8bf4a69928d6709669a71870690913aa7783a4..0c75a825bbacfac737032b8a09f0c3701629428a 100644 (file)
 #ifndef SGGeodesy_H
 #define SGGeodesy_H
 
-class SGGeoc;
-class SGGeod;
-
-template<typename T>
-class SGVec3;
-
 class SGGeodesy {
 public:
   // Hard numbers from the WGS84 standard.
index bcf147c6e5cf9144f1fa065fe78f727aa50dffcf..ac040edcd57ec653dfe008a72c993b7db9cc2068 100644 (file)
@@ -26,7 +26,4 @@
 template<typename T>
 class SGLimits : public std::numeric_limits<T> {};
 
-typedef SGLimits<float> SGLimitsf;
-typedef SGLimits<double> SGLimitsd;
-
 #endif
index 73ec59a02a744d9a693e02363c4ec20e6240e285..1bd807dd08216adc76198a1cdcdd4252b727d96f 100644 (file)
@@ -22,6 +22,9 @@
 
 #include <iosfwd>
 
+#include "SGMathFwd.hxx"
+
+#include "SGCMath.hxx"
 #include "SGLimits.hxx"
 #include "SGMisc.hxx"
 #include "SGGeodesy.hxx"
diff --git a/simgear/math/SGMathFwd.hxx b/simgear/math/SGMathFwd.hxx
new file mode 100644 (file)
index 0000000..0bbee1f
--- /dev/null
@@ -0,0 +1,52 @@
+// Copyright (C) 2006  Mathias Froehlich - Mathias.Froehlich@web.de
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Library General Public
+// License as published by the Free Software Foundation; either
+// version 2 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Library General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+//
+
+#ifndef SGMathFwd_H
+#define SGMathFwd_H
+
+// All forward declarations in case they only need to be declared
+
+class SGGeoc;
+class SGGeod;
+
+template<typename T>
+class SGLimits;
+template<typename T>
+class SGMatrix;
+template<typename T>
+class SGMisc;
+template<typename T>
+class SGQuat;
+template<typename T>
+class SGVec3;
+template<typename T>
+class SGVec4;
+
+typedef SGLimits<float> SGLimitsf;
+typedef SGLimits<double> SGLimitsd;
+typedef SGMatrix<float> SGMatrixf;
+typedef SGMatrix<double> SGMatrixd;
+typedef SGMisc<float> SGMiscf;
+typedef SGMisc<double> SGMiscd;
+typedef SGQuat<float> SGQuatf;
+typedef SGQuat<double> SGQuatd;
+typedef SGVec3<float> SGVec3f;
+typedef SGVec3<double> SGVec3d;
+typedef SGVec4<float> SGVec4f;
+typedef SGVec4<double> SGVec4d;
+
+#endif
index 35cabc302bb16783ee9dad56c2c8c7f50dd1ab96..9f0edce9c798a8b59d308424ebb3007675e3d158 100644 (file)
@@ -22,9 +22,6 @@
 template<typename T>
 struct TransNegRef;
 
-template<typename T>
-class SGMatrix;
-
 /// 3D Matrix Class
 template<typename T>
 class SGMatrix {
@@ -571,10 +568,6 @@ operator<<(std::basic_ostream<char_type, traits_type>& s, const SGMatrix<T>& m)
   return s;
 }
 
-/// Two classes doing actually the same on different types
-typedef SGMatrix<float> SGMatrixf;
-typedef SGMatrix<double> SGMatrixd;
-
 inline
 SGMatrixf
 toMatrixf(const SGMatrixd& m)
index 9540dd0343259ab751c5b7522513631deff9faa4..a6604cef5cd18e62452c8b8f4a40e4e6513fb544 100644 (file)
@@ -18,8 +18,6 @@
 #ifndef SGMisc_H
 #define SGMisc_H
 
-#include <cmath>
-
 template<typename T>
 class SGMisc {
 public:
@@ -51,6 +49,11 @@ public:
   static T deg2rad(const T& val)
   { return val*pi()/180; }
 
+  static T round(const T& v)
+  { return floor(v + T(0.5)); }
+  static int roundToInt(const T& v)
+  { return int(round(v)); }
+
 #ifndef NDEBUG
   /// Returns true if v is a NaN value
   /// Use with care: allways code that you do not need to use that!
@@ -71,7 +74,4 @@ public:
 #endif
 };
 
-typedef SGMisc<float> SGMiscf;
-typedef SGMisc<double> SGMiscd;
-
 #endif
index 0a4aee06976e0132bc26a09a250c12cbe44063b2..1ac86fe58310bd6857b2f7aa59935de2e15ada7f 100644 (file)
@@ -557,10 +557,6 @@ std::basic_ostream<char_type, traits_type>&
 operator<<(std::basic_ostream<char_type, traits_type>& s, const SGQuat<T>& v)
 { return s << "[ " << v(0) << ", " << v(1) << ", " << v(2) << ", " << v(3) << " ]"; }
 
-/// Two classes doing actually the same on different types
-typedef SGQuat<float> SGQuatf;
-typedef SGQuat<double> SGQuatd;
-
 inline
 SGQuatf
 toQuatf(const SGQuatd& v)
index e6ea50aa8ec00d909953cfb2e36afba4f4675c40..c6f9965743f4b0410ef019c152263c0dcc9af1fc 100644 (file)
@@ -328,10 +328,6 @@ std::basic_ostream<char_type, traits_type>&
 operator<<(std::basic_ostream<char_type, traits_type>& s, const SGVec3<T>& v)
 { return s << "[ " << v(0) << ", " << v(1) << ", " << v(2) << " ]"; }
 
-/// Two classes doing actually the same on different types
-typedef SGVec3<float> SGVec3f;
-typedef SGVec3<double> SGVec3d;
-
 inline
 SGVec3f
 toVec3f(const SGVec3d& v)
index 9df380d78698eaaf8f4446f73a0382e04b86d5a1..feee964b4b5b57b68915e1be74db7f289a20ceef 100644 (file)
@@ -280,10 +280,6 @@ std::basic_ostream<char_type, traits_type>&
 operator<<(std::basic_ostream<char_type, traits_type>& s, const SGVec4<T>& v)
 { return s << "[ " << v(0) << ", " << v(1) << ", " << v(2) << ", " << v(3) << " ]"; }
 
-/// Two classes doing actually the same on different types
-typedef SGVec4<float> SGVec4f;
-typedef SGVec4<double> SGVec4d;
-
 inline
 SGVec4f
 toVec4f(const SGVec4d& v)
diff --git a/simgear/math/fastmath.cxx b/simgear/math/fastmath.cxx
deleted file mode 100644 (file)
index 41b2739..0000000
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * \file fastmath.cxx
- * fast mathematics routines.
- *
- * References:
- *
- * A Fast, Compact Approximation of the Exponential Function
- * Nicol N. Schraudolph
- * IDSIA, Lugano, Switzerland
- * http://www.inf.ethz.ch/~schraudo/pubs/exp.pdf
- *
- * Base-2 exp, Laurent de Soras
- * http://www.musicdsp.org/archive.php?classid=5#106
- *
- * Fast log() Function, by Laurent de Soras:
- * http://www.flipcode.com/cgi-bin/msg.cgi?showThread=Tip-Fastlogfunction&forum=totd&id=-1
- *
- * Sin, Cos, Tan approximation
- * http://www.musicdsp.org/showArchiveComment.php?ArchiveID=115
- *
- * fast floating point power computation:
- * http://playstation2-linux.com/download/adam/power.c
- */
-
-/*
- * $Id$
- */
-
-
-#include <simgear/constants.h>
-
-#include "fastmath.hxx"
-
-/**
- * This function is on avarage 9 times faster than the system exp() function
- * and has an error of about 1.5%
- */
-static union {
-    double d;
-    struct {
-#if BYTE_ORDER == BIG_ENDIAN
-        int i, j;
-#else
-        int j, i;
-#endif
-    } n;
-} _eco;
-
-double fast_exp(double val) {
-    const double a = 1048576/M_LN2;
-    const double b_c = 1072632447; /* 1072693248 - 60801 */
-
-    _eco.n.i = (int)(a*val + b_c);
-
-    return _eco.d;
-}
-
-/*
- * Linear approx. between 2 integer values of val. Uses 32-bit integers.
- * Not very efficient but faster than exp()
- */
-double fast_exp2( const double val )
-{
-    int e;
-    double ret;
-
-    if (val >= 0) {
-        e = int (val);
-        ret = val - (e - 1);
-
-#if BYTE_ORDER == BIG_ENDIAN
-        ((*((int *) &ret)) &= ~(2047 << 20)) += (e + 1023) << 20;
-#else
-        ((*(1 + (int *) &ret)) &= ~(2047 << 20)) += (e + 1023) << 20;
-#endif
-    } else {
-        e = int (val + 1023);
-        ret = val - (e - 1024);
-
-#if BYTE_ORDER == BIG_ENDIAN
-        ((*((int *) &ret)) &= ~(2047 << 20)) += e << 20;
-#else
-        ((*(1 + (int *) &ret)) &= ~(2047 << 20)) += e << 20;
-#endif
-    }
-
-    return ret;
-}
-
-
-/*
- *
- */
-float _fast_log2(const float val)
-{
-    float result, tmp;
-    float mp = 0.346607f;
-
-    result = *(int*)&val;
-    result *= 1.0/(1<<23);
-    result = result - 127;
-    tmp = result - floor(result);
-    tmp = (tmp - tmp*tmp) * mp;
-    return tmp + result;
-}
-
-float _fast_pow2(const float val)
-{
-    float result;
-
-    float mp = 0.33971f;
-    float tmp = val - floor(val);
-    tmp = (tmp - tmp*tmp) * mp;
-
-    result = val + 127 - tmp; 
-    result *= (1<<23);
-    *(int*)&result = (int)result;
-    return result;
-}
-
-
-
-/**
- * While we're on the subject, someone might have use for these as well?
- * Float Shift Left and Float Shift Right. Do what you want with this.
- */
-void fast_BSL(float &x, register unsigned long shiftAmount) {
-
-       *(unsigned long*)&x+=shiftAmount<<23;
-
-}
-
-void fast_BSR(float &x, register unsigned long shiftAmount) {
-
-       *(unsigned long*)&x-=shiftAmount<<23;
-
-}
-
-
-/*
- * fastpow(f,n) gives a rather *rough* estimate of a float number f to the
- * power of an integer number n (y=f^n). It is fast but result can be quite a
- * bit off, since we directly mess with the floating point exponent.
- * 
- * Use it only for getting rough estimates of the values and where precision 
- * is not that important.
- */
-float fast_pow(const float f, const int n)
-{
-    long *lp,l;
-    lp=(long*)(&f);
-    l=*lp;l-=0x3F800000l;l<<=(n-1);l+=0x3F800000l;
-    *lp=l;
-    return f;
-}
-
-float fast_root(const float f, const int n)
-{
-    long *lp,l;
-    lp=(long*)(&f);
-    l=*lp;l-=0x3F800000l;l>>=(n-1);l+=0x3F800000l;
-    *lp=l;
-    return f;
-}
-
-
-/*
- * Code for approximation of cos, sin, tan and inv sin, etc.
- * Surprisingly accurate and very usable.
- *
- * Domain:
- * Sin/Cos    [0, pi/2]
- * Tan        [0,pi/4]
- * InvSin/Cos [0, 1]
- * InvTan     [-1, 1]
- */
-
-float fast_sin(const float val)
-{
-    float fASqr = val*val;
-    float fResult = -2.39e-08f;
-    fResult *= fASqr;
-    fResult += 2.7526e-06f;
-    fResult *= fASqr;
-    fResult -= 1.98409e-04f;
-    fResult *= fASqr;
-    fResult += 8.3333315e-03f;
-    fResult *= fASqr;
-    fResult -= 1.666666664e-01f;
-    fResult *= fASqr;
-    fResult += 1.0f;
-    fResult *= val;
-
-    return fResult;
-}
-
-float fast_cos(const float val)
-{
-    float fASqr = val*val;
-    float fResult = -2.605e-07f;
-    fResult *= fASqr;
-    fResult += 2.47609e-05f;
-    fResult *= fASqr;
-    fResult -= 1.3888397e-03f;
-    fResult *= fASqr;
-    fResult += 4.16666418e-02f;
-    fResult *= fASqr;
-    fResult -= 4.999999963e-01f;
-    fResult *= fASqr;
-    fResult += 1.0f;
-
-    return fResult;  
-}
-
-float fast_tan(const float val)
-{
-    float fASqr = val*val;
-    float fResult = 9.5168091e-03f;
-    fResult *= fASqr;
-    fResult += 2.900525e-03f;
-    fResult *= fASqr;
-    fResult += 2.45650893e-02f;
-    fResult *= fASqr;
-    fResult += 5.33740603e-02f;
-    fResult *= fASqr;
-    fResult += 1.333923995e-01f;
-    fResult *= fASqr;
-    fResult += 3.333314036e-01f;
-    fResult *= fASqr;
-    fResult += 1.0f;
-    fResult *= val;
-
-    return fResult;
-
-}
-
-float fast_asin(float val)
-{
-    float fRoot = sqrt(1.0f-val);
-    float fResult = -0.0187293f;
-    fResult *= val;
-    fResult += 0.0742610f;
-    fResult *= val;
-    fResult -= 0.2121144f;
-    fResult *= val;
-    fResult += 1.5707288f;
-    fResult = SGD_PI_2 - fRoot*fResult;
-
-    return fResult;
-}
-
-float fast_acos(float val)
-{
-    float fRoot = sqrt(1.0f-val);
-    float fResult = -0.0187293f;
-    fResult *= val;
-    fResult += 0.0742610f;
-    fResult *= val;
-    fResult -= 0.2121144f;
-    fResult *= val;
-    fResult += 1.5707288f;
-    fResult *= fRoot;
-
-    return fResult;
-}
-
-float fast_atan(float val)
-{
-    float fVSqr = val*val;
-    float fResult = 0.0028662257f;
-    fResult *= fVSqr;
-    fResult -= 0.0161657367f;
-    fResult *= fVSqr;
-    fResult += 0.0429096138f;
-    fResult *= fVSqr;
-    fResult -= 0.0752896400f;
-    fResult *= fVSqr;
-    fResult += 0.1065626393f;
-    fResult *= fVSqr;
-    fResult -= 0.1420889944f;
-    fResult *= fVSqr;
-    fResult += 0.1999355085f;
-    fResult *= fVSqr;
-    fResult -= 0.3333314528f;
-    fResult *= fVSqr;
-    fResult += 1.0f;
-    fResult *= val;
-
-    return fResult;
-}
diff --git a/simgear/math/fastmath.hxx b/simgear/math/fastmath.hxx
deleted file mode 100644 (file)
index b84f3e9..0000000
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * \file fastmath.hxx
- * fast mathematics routines.
- *
- * References:
- *
- * A Fast, Compact Approximation of the Exponential Function
- * Nicol N. Schraudolph
- * IDSIA, Lugano, Switzerland
- * http://www.inf.ethz.ch/~schraudo/pubs/exp.pdf
- *
- * Fast log() Function, by Laurent de Soras:
- * http://www.flipcode.com/cgi-bin/msg.cgi?showThread=Tip-Fastlogfunction&forum=totd&id=-1
- *
- */
-
-/*
- * $Id$
- */
-
-#ifndef _SG_FMATH_HXX
-#define _SG_FMATH_HXX 1
-
-#ifndef __cplusplus
-# error This library requires C++
-#endif
-
-#include <math.h>
-
-
-double fast_exp(double val);
-double fast_exp2(const double val);
-
-float fast_pow(const float val1, const float val2);
-float fast_log2(const float cal);
-float fast_root(const float f, const int n);
-
-float _fast_pow2(const float cal);
-float _fast_log2(const float val);
-
-float fast_sin(const float val);
-float fast_cos(const float val);
-float fast_tan(const float val);
-float fast_asin(const float val);
-float fast_acos(const float val);
-float fast_atan(const float val);
-
-void fast_BSL(float &x, register unsigned long shiftAmount);
-void fast_BSR(float &x, register unsigned long shiftAmount);
-
-
-inline float fast_log2 (float val)
-{
-    union {
-        float f;
-        int i;
-    } v;
-    v.f = val;
-    const int log_2 = ((v.i >> 23) & 255) - 128;
-    v.i &= ~(255 << 23);
-    v.i += 127 << 23;
-
-    v.f = ((-1.0f/3) * v.f + 2) * v.f - 2.0f/3;   // (1)
-
-    return (v.f + log_2);
-}
-
-
-/**
- * This function is about 3 times faster than the system log() function
- * and has an error of about 0.01%
- */
-inline float fast_log (const float &val)
-{
-   return (fast_log2 (val) * 0.69314718f);
-}
-
-inline float fast_log10 (const float &val)
-{
-   return (fast_log2(val) / 3.321928095f);
-}
-
-
-/**
- * This function is about twice as fast as the system pow(x,y) function
- */
-inline float fast_pow(const float val1, const float val2)
-{
-   return _fast_pow2(val2 * _fast_log2(val1));
-}
-
-
-/*
- * Haven't seen this elsewhere, probably because it is too obvious?
- * Anyway, these functions are intended for 32-bit floating point numbers
- * only and should work a bit faster than the regular ones.
- */
-inline float fast_abs(float f)
-{
-    union {
-        float f;
-        int i;
-    } v;
-    v.f = f;
-    v.i = v.i&0x7fffffff;
-    return v.f;
-}
-
-inline float fast_neg(float f)
-{
-    union {
-        float f;
-        int i;
-    } v;
-    v.f = f;
-    v.i = v.i^0x80000000;
-    return v.f;
-}
-
-inline int fast_sgn(float f)
-{
-    union {
-        float f;
-        int i;
-    } v;
-    v.f = f;
-    return 1+((v.i>>31)<<1);
-}
-
-
-
-/**
- * Quick rounding function.
- */
-#if defined(i386)
-#define USE_X86_ASM
-#endif
-
-#if defined(USE_X86_ASM)
-static __inline__ int float_to_int(float f)
-{
-    int r;
-    __asm__ ("fistpl %0" : "=m" (r) : "t" (f) : "st");
-    return r;
-}
-#elif  defined(__MSC__) && defined(__WIN32__)
-static __inline int float_to_int(float f)
-{
-    int r;
-    _asm {
-        fld f
-        fistp r
-    }
-    return r;
-}
-#else
-#define float_to_int(F) ((int) ((F) < 0.0f ? (F)-0.5f : (F)+0.5f))
-#endif
-
-
-#endif // !_SG_FMATH_HXX
-
index 6aa93b28a35dfcfc09327ba3120781bcfda1874b..be5a8213be421cf86dc33edf59c5b92745a10ff7 100644 (file)
 
 #include <simgear/compiler.h>
 
-#ifdef SG_HAVE_STD_INCLUDES
-#  include <cmath>
-#else
-#  include <math.h>
-#endif
 #include <string.h>
 
 #include <simgear/debug/logstream.hxx>
 #include <simgear/props/condition.hxx>
-#include <simgear/math/fastmath.hxx>
+#include <simgear/math/SGMath.hxx>
 
 
 #include "xmlsound.hxx"
 
 
-#define LOG_ABS(x) (((x) > 1) ? (x) : (((x) < -1) ? -(x) : 0))
 // static double _snd_lin(double v)   { return v; }
 static double _snd_inv(double v)   { return (v == 0) ? 1e99 : 1/v; }
 static double _snd_abs(double v)   { return (v >= 0) ? v : -v; }
-static double _snd_sqrt(double v)  { return (v < 0) ? sqrt(-v) : sqrt(v); }
-static double _snd_log10(double v) { return fast_log10( LOG_ABS(v) ); }
-static double _snd_log(double v)   { return fast_log( LOG_ABS(v) ); }
+static double _snd_sqrt(double v)  { return sqrt(fabs(v)); }
+static double _snd_log10(double v) { return log10(fabs(v)); }
+static double _snd_log(double v)   { return log(fabs(v)); }
 // static double _snd_sqr(double v)   { return v*v; }
 // static double _snd_pow3(double v)  { return v*v*v; }