Mercurial > hg > octave-nkf
diff liboctave/DET.h @ 8335:64cf956a109c
templatize & fix DET
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Wed, 19 Nov 2008 11:23:07 +0100 |
parents | |
children | 9813c07ca946 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/liboctave/DET.h @@ -0,0 +1,87 @@ +/* + +Copyright (C) 2008 Jaroslav Hajek + +This file is part of Octave. + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +Octave 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 General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with Octave; see the file COPYING. If not, see +<http://www.gnu.org/licenses/>. + +*/ + +#if !defined (octave_DET_h) +#define octave_DET_h 1 + +#include <cmath> +#include "oct-cmplx.h" +#include "lo-mappers.h" + +template <class T> +class +OCTAVE_API +base_det +{ +public: + + base_det (T c = 0, int e = 0) + { + c2 = xlog2 (c, e2); + e2 += e; + } + + base_det (T c, double e, double b) + { + e *= xlog2 (b); + e2 = e; + c *= xexp2 (e - e2); + int f; + c2 = xlog2 (c, f); + e2 += f; + } + + base_det (const base_det& a) : c2(a.c2), e2(a.e2) { } + + base_det& operator = (const base_det& a) + { + c2 = a.c2; + e2 = a.e2; + return *this; + } + + T coef (void) const { return c2; } + int exp (void) const { return e2; } + + T value () const { return c2 * static_cast<T> (std::ldexp (1.0, e2)); } + operator T () const { return value (); } + + void operator *= (T t) + { + int e; + c2 *= xlog2 (t, e); + e2 += e; + } + +private: + + T c2; + int e2; +}; + +// Provide the old types by typedefs. +typedef base_det<double> DET; +typedef base_det<float> FloatDET; +typedef base_det<Complex> ComplexDET; +typedef base_det<FloatComplex> FloatComplexDET; + +#endif