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.



    Part I: Software Engineering and Computer Games
    Part II: Software Engineering and Computer Games Reference