22.17 Real numbers


22.17 Real numbers

Simulations work better with real numbers, and there is a Real type and some macros we use in our programs, so we're going to have a file called RealNumber.h which we include in our files using real numbers. (If we didn't want to do all those includes, we could have put the #include "realnumber.h" somewhere inside of the StdAfx.h file, for instance right before the line that says //{{AFX_INSERT_LOCATION}} .)

In our code we use Real as another word for double or for float . To give ourselves the freedom to switch between double and float , depending on whether we have a greater need for accuracy or for speed, we have a line saying typedef double Real or typedef float Real inside RealNumber.h .

 #ifndef REALNUMBER_H  #define REALNUMBER_H  /* Note that to use the Real type throughout my program, I have to      always remember to include realnumber.h. */  #define USEFLOAT // float is slightly faster, slightly less accurate.  #ifdef USEFLOAT      typedef float Real;  #else //not USEFLOAT      typedef double Real;  #endif //USEFLOAT  /* When I use a float Real, I'll get warning messages generated by      the fact that constants like 2.0 are viewed as doubles, so that      if x is a float, the line x = x/2.0 would be viewed as converting      a double to a float. These messages take this form: warning C4244:      '=' : conversion from 'double' to 'float', possible loss of data      warning C4305: '=' : truncation from 'const double' to 'float'      I can disable these warning messages with a pragma stating the      two warning numbers. */  #pragma warning(disable: 4305 4244)  #define PI 3.14159265358979  #define CLAMP(x,lo,hi) (x)=(((x)<(lo))?(lo):(((x)>(hi))?(hi):(x)))  #define SMALL_REAL 0.00001  #define BIG_REAL 1000000000.0  #endif //REALNUMBER_H 

The point of the typedef double Real line is that if at some point you find that you want to squeeze a little more speed out of our program, you can come back here and replace double by float . We need PI because, although the ANSI C library is supposed to define an M_PI constant of this value in math.h , the Microsoft version of the math.h file doesn't seem to have any pi in it. (For sanity 's sake, a software engineer learns not to obsess over things like this; simply fix them and move on.) The CLAMP macro is useful for forcing a variable x to lie between two values lo and hi. SMALL_REAL is convenient in code where you want to avoid dividing by numbers that are too close to 0. And BIG_REAL is useful to put in as a starting value in a search loop when we keep looking for a smaller number, as in the code for cCritter* cBiota::pickClosest(const cVector &vclick) in biota.cpp for instance.



Software Engineering and Computer Games
Software Engineering and Computer Games
ISBN: B00406LVDU
EAN: N/A
Year: 2002
Pages: 272

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net