diff options
author | dburgess <dburgess@19bc5d8c-e614-43d4-8b26-e1612bc8e597> | 2011-10-07 02:40:51 +0000 |
---|---|---|
committer | dburgess <dburgess@19bc5d8c-e614-43d4-8b26-e1612bc8e597> | 2011-10-07 02:40:51 +0000 |
commit | 82c46ff7aeb793d70f11fcaf22b2813b7dc0f78b (patch) | |
tree | 25cf269a01eaf3ae2ca0cece6f1a22ca61308e6d /CommonLibs/F16.h | |
parent | cd8381743f1fe458f10e96020ad4626f4ae3d7bd (diff) |
Putting the actual OpenBTS P2.8 source code into the public SVN branch.
git-svn-id: http://wush.net/svn/range/software/public/openbts/trunk@2242 19bc5d8c-e614-43d4-8b26-e1612bc8e597
Diffstat (limited to 'CommonLibs/F16.h')
-rw-r--r-- | CommonLibs/F16.h | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/CommonLibs/F16.h b/CommonLibs/F16.h new file mode 100644 index 0000000..aa292f0 --- /dev/null +++ b/CommonLibs/F16.h @@ -0,0 +1,210 @@ +/* +* Copyright 2009 Free Software Foundation, Inc. +* +* This software is distributed under the terms of the GNU Affero Public License. +* See the COPYING file in the main directory for details. +* +* This use of this software may be subject to additional restrictions. +* See the LEGAL file in the main directory for details. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +*/ + + +#ifndef F16_H +#define F16_H + +#include <stdint.h> +#include <ostream> + + + +/** Round a float to the appropriate F16 value. */ +inline int32_t _f16_round(float f) +{ + if (f>0.0F) return (int32_t)(f+0.5F); + if (f<0.0F) return (int32_t)(f-0.5F); + return 0; +} + + + +/** A class for F15.16 fixed point arithmetic with saturation. */ +class F16 { + + + private: + + int32_t mV; + + + public: + + F16() {} + + F16(int i) { mV = i<<16; } + F16(float f) { mV = _f16_round(f*65536.0F); } + F16(double f) { mV = _f16_round((float)f*65536.0F); } + + int32_t& raw() { return mV; } + const int32_t& raw() const { return mV; } + + float f() const { return mV/65536.0F; } + + //operator float() const { return mV/65536.0F; } + //operator int() const { return mV>>16; } + + F16 operator=(float f) + { + mV = _f16_round(f*65536.0F); + return *this; + } + + F16 operator=(int i) + { + mV = i<<16; + return *this; + } + + F16 operator=(const F16& other) + { + mV = other.mV; + return mV; + } + + F16 operator+(const F16& other) const + { + F16 retVal; + retVal.mV = mV + other.mV; + return retVal; + } + + F16& operator+=(const F16& other) + { + mV += other.mV; + return *this; + } + + F16 operator-(const F16& other) const + { + F16 retVal; + retVal.mV = mV - other.mV; + return retVal; + } + + F16& operator-=(const F16& other) + { + mV -= other.mV; + return *this; + } + + F16 operator*(const F16& other) const + { + F16 retVal; + int64_t p = (int64_t)mV * (int64_t)other.mV; + retVal.mV = p>>16; + return retVal; + } + + F16& operator*=(const F16& other) + { + int64_t p = (int64_t)mV * (int64_t)other.mV; + mV = p>>16; + return *this; + } + + F16 operator*(float f) const + { + F16 retVal; + retVal.mV = mV * f; + return retVal; + } + + F16& operator*=(float f) + { + mV *= f; + return *this; + } + + F16 operator/(const F16& other) const + { + F16 retVal; + int64_t pV = (int64_t)mV << 16; + retVal.mV = pV / other.mV; + return retVal; + } + + F16& operator/=(const F16& other) + { + int64_t pV = (int64_t)mV << 16; + mV = pV / other.mV; + return *this; + } + + F16 operator/(float f) const + { + F16 retVal; + retVal.mV = mV / f; + return retVal; + } + + F16& operator/=(float f) + { + mV /= f; + return *this; + } + + bool operator>(const F16& other) const + { + return mV>other.mV; + } + + bool operator<(const F16& other) const + { + return mV<other.mV; + } + + bool operator==(const F16& other) const + { + return mV==other.mV; + } + + bool operator>(float f) const + { + return (mV/65536.0F) > f; + } + + bool operator<(float f) const + { + return (mV/65536.0F) < f; + } + + bool operator==(float f) const + { + return (mV/65536.0F) == f; + } + +}; + + + +inline std::ostream& operator<<(std::ostream& os, const F16& v) +{ + os << v.f(); + return os; +} + +#endif + |