X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Freal.h;h=917f3e0ca9bd7bd91e5dc053972bbc1021e2dcd3;hp=9ea302dbc8ef83f7a8d4fce6d0aad55aeaa8a9c0;hb=64b7c42c71c35d520424cf4ca5ecaa99faef8b26;hpb=20788af97c06b76040ea2de5ab3ddc683a261365 diff --git a/src/real.h b/src/real.h index 9ea302d..917f3e0 100644 --- a/src/real.h +++ b/src/real.h @@ -13,11 +13,17 @@ #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!" #endif +#define XSTR(x) STR(x) +#define STR(x) #x +//#pragma message "REALTYPE = " XSTR(REALTYPE) + #if REALTYPE == REAL_VFPU #include "vfpu.h" #endif @@ -40,32 +46,49 @@ #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[]; #if REALTYPE == REAL_SINGLE typedef float Real; + inline Real RealFromStr(const char * str) {return strtof(str, NULL);} + inline std::string Str(const Real & a) {std::stringstream s; s << a; return s.str();} #elif REALTYPE == REAL_DOUBLE typedef double Real; + inline Real RealFromStr(const char * str) {return strtod(str, NULL);} + inline std::string Str(const Real & a) {std::stringstream s; s << a; return s.str();} #elif REALTYPE == REAL_LONG_DOUBLE typedef long double Real; + inline Real RealFromStr(const char * str) {return strtold(str, NULL);} + inline std::string Str(const Real & a) {std::stringstream s; s << a; return s.str();} #elif REALTYPE == REAL_VFPU typedef VFPU::VFloat Real; inline float Float(const Real & r) {return r.m_value;} inline double Double(const Real & r) {return r.m_value;} + inline Real RealFromStr(const char * str) {return Real(strtod(str, NULL));} #elif REALTYPE == REAL_RATIONAL typedef Rational Real; inline float Float(const Real & r) {return (float)r.ToDouble();} 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();} @@ -73,12 +96,32 @@ namespace IPDF inline int64_t Int64(const Real & r) {return r.toLong();} inline Real Sqrt(const Real & r) {return mpfr::sqrt(r, mpfr::mpreal::get_default_rnd());} inline Real Abs(const Real & r) {return mpfr::abs(r, mpfr::mpreal::get_default_rnd());} + inline Real RealFromStr(const char * str) {return Real(strtod(str, NULL));} #elif REALTYPE == REAL_IRRAM typedef iRRAM::REAL Real; inline double Double(const Real & r) {return r.as_double(53);} inline float Float(const Real & r) {return r.as_double(53);} 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;} + inline std::string Str(const Real & a) {return a.Str();} + #else #error "Type of Real unspecified." #endif //REALTYPE @@ -93,7 +136,19 @@ namespace IPDF inline double Double(long double f) {return (double)(f);} inline double Sqrt(double f) {return sqrt(f);} inline double Abs(double a) {return fabs(a);} - inline int64_t Int64(double a){return (int64_t)a;} + inline double Log10(double a) {return log(a)/log(10.0);} + inline size_t Size(double a) {return sizeof(a);} + inline size_t Size(float a) {return sizeof(a);} + + + inline int64_t Int64(double a) + { + if (a < INT64_MIN) + return INT64_MIN; + if (a > INT64_MAX) + return INT64_MAX; + return (int64_t)(a); + } inline Real Power(const Real & a, int n) { @@ -110,7 +165,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 @@ -137,9 +192,21 @@ 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)); + #if REALTYPE == REAL_PARANOIDNUMBER + #ifdef PARANOID_SIZE_LIMIT + Debug("Size limit of %d is being enforced", PARANOID_SIZE_LIMIT); + #endif + #endif + } } #endif //_REAL_H