00001 /*
00002 File: VLMath.h
00003
00004 Function: Various math definitions for VL
00005
00006 Author(s): Andrew Willmott
00007
00008 Copyright: (c) 1995-2000, Andrew Willmott
00009 */
00010
00011 #ifndef __VL_MATH__
00012 #define __VL_MATH__
00013
00014 #include <stdlib.h>
00015
00016 // --- Inlines ----------------------------------------------------------------
00017
00018 // additions to arithmetic functions
00019
00020 #ifdef VL_HAS_IEEEFP
00021 #include <ieeefp.h>
00022 #define vl_is_finite(X) finite(X)
00023 #elif defined (__GNUC__) && defined(__USE_MISC)
00024 #define vl_is_finite(X) finite(X)
00025 #else
00026 #define vl_is_finite(X) (1)
00027 #endif
00028
00029 inline Double vl_rand()
00030 { return(drand48()); }
00031
00032 #ifndef __CMATH__
00033 // GNU's complex.h defines its own abs(double)
00034 #ifdef VL_HAS_ABSF
00035 inline Float abs(Float x)
00036 { return (fabsf(x)); }
00037 #endif
00038 inline Double abs(Double x)
00039 { return (fabs(x)); }
00040 #endif
00041 #ifdef VL_HAS_ABSF
00042 inline Float len(Float x)
00043 { return (fabsf(x)); }
00044 #endif
00045 inline Double len(Double x)
00046 { return (fabs(x)); }
00047
00048 inline Float sqrlen(Float r)
00049 { return(sqr(r)); }
00050 inline Double sqrlen(Double r)
00051 { return(sqr(r)); }
00052
00053 inline Float mix(Float a, Float b, Float s)
00054 { return((1.0 - s) * a + s * b); }
00055 inline Double mix(Double a, Double b, Double s)
00056 { return((1.0 - s) * a + s * b); }
00057
00058 inline Double sign(Double d)
00059 {
00060 if (d < 0)
00061 return(-1.0);
00062 else
00063 return(1.0);
00064 }
00065
00066 // useful routines
00067
00068 inline Void SetReal(Float &a, Double b)
00069 { a = b; }
00070 inline Void SetReal(Double &a, Double b)
00071 { a = b; }
00072
00073 inline Bool IsPowerOfTwo(Int a)
00074 { return((a & -a) == a); };
00075
00076 template <class S, class T> inline Void ConvertVec(const S &u, T &v)
00077 {
00078 for (Int i = 0; i < u.Elts(); i++)
00079 v[i] = u[i];
00080 }
00081
00082 template <class T> inline Void ConvertVec(const T &u, T &v)
00083 { v = u; }
00084
00085 template <class S, class T> inline Void ConvertMat(const S &m, T &n)
00086 {
00087 for (Int i = 0; i < m.Rows(); i++)
00088 ConvertVec(m[i], n[i]);
00089 }
00090
00091 template <class T> inline Void ConvertMat(const T &m, T &n)
00092 { n = m; }
00093
00094
00095 #endif