X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Freal.h;h=e72709ba427610199cd37eb468bebe231d9fe481;hp=917f3e0ca9bd7bd91e5dc053972bbc1021e2dcd3;hb=f3452f32fba45b1f317e4a6a1906d16068ce3bdf;hpb=64b7c42c71c35d520424cf4ca5ecaa99faef8b26 diff --git a/src/real.h b/src/real.h index 917f3e0..e72709b 100644 --- a/src/real.h +++ b/src/real.h @@ -3,6 +3,7 @@ #include "common.h" #include +#include #define REAL_SINGLE 0 @@ -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." @@ -140,6 +141,12 @@ namespace IPDF 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) { @@ -198,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));