X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Freal.h;h=e72709ba427610199cd37eb468bebe231d9fe481;hp=72def6988bfc3e99466c58f9870ea75d3e35dd6d;hb=f3452f32fba45b1f317e4a6a1906d16068ce3bdf;hpb=326f04a375ce3120f7e8957e3d7cd5f296f513e3 diff --git a/src/real.h b/src/real.h index 72def69..e72709b 100644 --- a/src/real.h +++ b/src/real.h @@ -3,6 +3,7 @@ #include "common.h" #include +#include #define REAL_SINGLE 0 @@ -22,7 +23,7 @@ #define XSTR(x) STR(x) #define STR(x) #x -#pragma message "REALTYPE = " XSTR(REALTYPE) +//#pragma message "REALTYPE = " XSTR(REALTYPE) #if REALTYPE == REAL_VFPU #include "vfpu.h" @@ -120,7 +121,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." @@ -136,7 +137,16 @@ 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 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);} + + // 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) { @@ -195,6 +205,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));