X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=src%2Freal.h;h=adb9503369456988997f67118b027da00c20cfe3;hb=03cc1b0a0d0705e0b1d92e13fdb18608c7a00272;hp=5d4e1333ee14bf0204696c614c5a53119fc4c235;hpb=6ce000e7212d9f5db6e5998c41df15bcad2022c8;p=ipdf%2Fcode.git diff --git a/src/real.h b/src/real.h index 5d4e133..adb9503 100644 --- a/src/real.h +++ b/src/real.h @@ -13,6 +13,8 @@ #define REAL_RATIONAL_ARBINT 5 #define REAL_MPFRCPP 6 #define REAL_IRRAM 7 +#define REAL_PARANOIDNUMBER 8 +#define REAL_GMPRAT 9 #ifndef REALTYPE #error "REALTYPE was not defined!" @@ -40,6 +42,14 @@ #include "../contrib/iRRAM/include/iRRAM/lib.h" #endif +#if REALTYPE == REAL_PARANOIDNUMBER + #include "paranoidnumber.h" +#endif + +#if REALTYPE == REAL_GMPRAT + #include "gmprat.h" +#endif + namespace IPDF { extern const char * g_real_name[]; @@ -64,13 +74,14 @@ namespace IPDF inline double Double(const Real & r) {return r.ToDouble();} inline Real RealFromStr(const char * str) {return Real(strtod(str, NULL));} #elif REALTYPE == REAL_RATIONAL_ARBINT - #define ARBINT Gmpint // Set to Gmpint or Arbint here + #define ARBINT Arbint // Set to Gmpint or Arbint here typedef Rational Real; inline float Float(const Real & r) {return (float)r.ToDouble();} inline double Double(const Real & r) {return r.ToDouble();} inline int64_t Int64(const Real & r) {return r.ToInt64();} inline Rational Sqrt(const Rational & r) {return r.Sqrt();} + inline Real RealFromStr(const char * str) {return Real(strtod(str, NULL));} #elif REALTYPE == REAL_MPFRCPP typedef mpfr::mpreal Real; inline double Double(const Real & r) {return r.toDouble();} @@ -86,6 +97,23 @@ namespace IPDF inline int64_t Int64(const Real & r) {return (int64_t)r.as_double(53);} inline Real Sqrt(const Real & r) {return iRRAM::sqrt(r);} inline Real RealFromStr(const char * str) {return Real(strtod(str, NULL));} +#elif REALTYPE == REAL_PARANOIDNUMBER + typedef ParanoidNumber Real; + inline double Double(const Real & r) {return r.Digit();} + inline float Float(const Real & r) {return r.Digit();} + inline int64_t Int64(const Real & r) {return (int64_t)r.Digit();} + inline Real Sqrt(const Real & r) {return Real(sqrt(r.Digit()));} + inline Real RealFromStr(const char * str) {return Real(str);} + inline Real Abs(const Real & a) {return Real(fabs(a.Digit()));} +#elif REALTYPE == REAL_GMPRAT + typedef Gmprat Real; + inline double Double(const Real & r) {return r.ToDouble();} + inline float Float(const Real & r) {return (float)(r.ToDouble());} + inline int64_t Int64(const Real & r) {return (int64_t)r.ToDouble();} + inline Real Sqrt(const Real & r) {return Real(sqrt(r.ToDouble()));} + inline Real RealFromStr(const char * str) {return Real(strtod(str, NULL));} + inline Real Abs(const Real & a) {return (a > Real(0)) ? a : Real(0)-a;} + #else #error "Type of Real unspecified." #endif //REALTYPE @@ -117,7 +145,7 @@ namespace IPDF { Real x; Real y; - Vec2() : x(0), y(0) {} + Vec2() : x(0.0), y(0.0) {} Vec2(Real _x, Real _y) : x(_x), y(_y) {} Vec2(const std::pair & p) : x(p.first), y(p.second) {} #if REALTYPE != REAL_IRRAM @@ -144,9 +172,13 @@ namespace IPDF }; + //TODO: Make sure there is actually a RealFromStr(const char * str) function + // Or this will recurse infinitely + // (If you remove this it will also break). inline Real RealFromStr(const std::string & str) {return RealFromStr(str.c_str());} + inline void DebugRealInfo() {Debug("Compiled with REAL = %d => \"%s\" sizeof(Real) == %d bytes", REALTYPE, g_real_name[REALTYPE], sizeof(Real));} }