X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Freal.h;h=13395fb75cac4457db0db17777c4c981ae8668d5;hp=e4d594e34002ff1ad589600c013e4aaffbd08573;hb=f28146cf72fc68c8d3690814b1f89d47b8c4e7b9;hpb=ec45b44e3a44e12463c63ec09d63c648602ce866 diff --git a/src/real.h b/src/real.h index e4d594e..13395fb 100644 --- a/src/real.h +++ b/src/real.h @@ -3,6 +3,7 @@ #include "common.h" #include +#include #define REAL_SINGLE 0 @@ -40,6 +41,7 @@ #if REALTYPE == REAL_MPFRCPP #include + #endif //REALTYPE #if REALTYPE == REAL_IRRAM @@ -61,11 +63,11 @@ namespace IPDF #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();} + 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();} + 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);} @@ -97,6 +99,10 @@ namespace IPDF 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));} + inline std::string Str(const mpfr::mpreal & a) {std::stringstream s; s << a; return s.str();} + inline size_t Size(mpfr::mpreal & a) {return a.get_prec();} + inline mpfr::mpreal Log10(const mpfr::mpreal & a) {return mpfr::log10(a);} + #elif REALTYPE == REAL_IRRAM typedef iRRAM::REAL Real; inline double Double(const Real & r) {return r.as_double(53);} @@ -120,7 +126,7 @@ namespace IPDF 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." @@ -137,9 +143,16 @@ namespace IPDF inline double Sqrt(double f) {return sqrt(f);} inline double Abs(double a) {return fabs(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 size_t Size(double a) {return sizeof(a);} + + // Don't cause an exception + inline float ClampFloat(double d) + { + float f = (fabs(d) < FLT_MAX) ? ((fabs(d) > FLT_MIN) ? (float)d : FLT_MIN) : FLT_MAX; + return copysign(f, d); + } inline int64_t Int64(double a) { @@ -198,6 +211,91 @@ namespace IPDF inline Real RealFromStr(const std::string & str) {return RealFromStr(str.c_str());} + // things stolen from wikipedia and googling + inline const char * HumanScale(double f) + { + if (f < 1e-36) + return "RATHER SMALL"; + if (f < 1e-35) + return "Plank Length"; + if (f < 1e-25) + return "Turtles all the way"; + if (f < 1e-24) + return "More turtles"; + if (f < 1e-23) + return "Turtles"; + if (f < 1e-22) + return "This small"; + if (f < 1e-21) + return "To find things"; + if (f < 1e-20) + return "It is pretty difficult"; + if (f < 1e-19) + return "Not much"; + if (f < 1e-17) + return "Weak Force"; + if (f < 1e-16) + return "Proton"; + if (f < 1e-15) + return "(Classical) Electron"; + if (f < 1e-11) + return "Inter atomic (still)"; + if (f < 1e-10) + return "Inter atomic"; + if (f < 1e-9) + return "Atom"; + if (f < 1e-8) + return "DNA"; + if (f < 1e-7) + return "Virus"; + if (f < 1e-6) + return "Light"; + if (f < 1e-5) + return "Bacteria"; + if (f < 1e-4) + return "4004 Transistor"; + if (f < 1e-3) + return "Ant"; + if (f < 1e-2) + return "Coin"; + if (f < 1e-1) + return "iPhone"; + if (f < 1e0) + return "Person"; + if (f < 1e1) + return "Building"; + if (f < 1e2) + return "Football Field"; + if (f < 1e3) + return "Mountain"; + if (f < 1e4) + return "Clouds"; + if (f < 1e5) + return "Countries"; + if (f < 1e6) + return "Earth"; + if (f < 1e8) + return "Between Earth and Moon"; + if (f < 1e9) + return "Solar System"; + if (f < 1e13) + return "Distance to nearest Star"; + if (f < 1e21) + return "Milky Way"; + if (f < 1e26) + return "Universe"; + if (f < 1e27) + return "A bigger Universe"; + if (f < 1e28) + return "Really big things"; + if (f < 1e29) + return "Almost as big as..."; + if (f < 1e30) + return "Wolfram's Magestic Ego"; + return "QUITE BIG"; + + } + inline void DebugRealInfo() { Debug("Compiled with REAL = %d => \"%s\" sizeof(Real) == %d bytes", REALTYPE, g_real_name[REALTYPE], sizeof(Real));