#include "common.h"
#include <cmath>
+#include <cfloat>
#define REAL_SINGLE 0
#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
#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 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
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);}
+
+ // 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)
+ {
+ 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)
{
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));
+ #if REALTYPE == REAL_PARANOIDNUMBER
+ #ifdef PARANOID_SIZE_LIMIT
+ Debug("Size limit of %d is being enforced", PARANOID_SIZE_LIMIT);
+ #endif
+ #endif
+ }
}
#endif //_REAL_H