namespace IPDF
{
-//#define REAL_FLOAT
-#define REAL_DOUBLE
+#define REAL_SINGLE
+//#define REAL_DOUBLE
//#define REAL_HALF
#ifdef REAL_SINGLE
struct Real
{
Real() = default;
- Real(float r) : value(r)
+ Real(double r) : value(r)
{
int & a = *((int*)(&value)); // um...
// mask out extra bits in exponent
//1000 1111 1000 0000 0000 0011 1111 1111
// Endianness matters
- a &= 0xFF3008F8;//0x8F8003FF;
+ a &= 0xFFC001F1; //0x8F8003FF;
}
- Real operator+(float f) {return Real(value+f);}
- Real operator-(float f) {return Real(value+f);}
- Real operator/(float f) {return Real(value/f);}
- Real operator*(float f) {return Real(value*f);}
- Real operator+(const Real & r) {return this->operator+(r.value);}
- Real operator-(const Real & r) {return this->operator-(r.value);}
- Real operator*(const Real & r) {return this->operator*(r.value);}
- Real operator/(const Real & r) {return this->operator/(r.value);}
+ Real operator+(float f) const {return Real(value+f);}
+ Real operator-(float f) const {return Real(value+f);}
+ Real operator/(float f) const {return Real(value/f);}
+ Real operator*(float f) const {return Real(value*f);}
+ Real operator+(const Real & r) const {return Real(this->value + r.value);}
+ Real operator-(const Real & r) const {return Real(this->value - r.value);}
+ Real operator*(const Real & r) const {return Real(this->value * r.value);}
+ Real operator/(const Real & r) const {return Real(this->value / r.value);}
+ Real & operator+=(const Real & r) {this->value += r.value; return *this;}
+ Real & operator-=(const Real & r) {this->value -= r.value; return *this;}
+ Real & operator/=(const Real & r) {this->value /= r.value; return *this;}
+ Real & operator*=(const Real & r) {this->value *= r.value; return *this;}
+
float value;
};
inline float Float(Real r) {return r.value;}