page updated 2012-10-20
W&B Center of Gravity Limits Check
fwd c.g. aft limit %mac limit zero fuel weight 604720 16.0 33.0 33.0
Given the lines above from an F7 balance display, notice the c.g. %mac is 33.0 and green and the aft limit is 33.0. No error message would be generated.
You might also see a c.g. %mac of 33.0 in red, and an error message would be generated.
zero fuel weight 604720 16.0 33.0 33.0
How can a %mac of 33.0 be both okay and not okay?
In both instances 33.0 is the number supplied by Boeing to that number of decimal places for the zero fuel weight aft c.g. limit. The computer holds it as a single-precision floating-point number. Think of it as 33.00000.
The c.g. %mac is the computed value of the zero fuel weight c.g. It's also a single-precision floating-point number. It might be 32.96000. It could also be 33.04000. Both round to 33.0, but the first would be within the limit, the second would not, using the unrounded numbers.
An argument could be made that the comparison should be made using the rounded values rather than the unrounded values. Personally I'm staying out of the argument. However, all program updates after March 2010 include an option to do it either way. Those choosing to use rounded values will never see a c.g. %mac and a c.g. limit of the same value and that results in an error message.
But there are diffent ways of rounding that produce different results. So, for those interested, the code snippet below shows what I did. The cgaft() function returns a 0 (false) if the %mac value is within the aft c.g. limit, a 1 (true) if it is not. If bUseRoundedCG is true, the test uses rounded values, if not, unrounded are used. A USE_ROUNDED_CG keyword in the first line of an aircraft's primary data file sets the value of bUseRoundedCG to true. The absence of the keyword sets it to false. Currently the only aircraft that I'm aware of that uses USE_ROUNDED_CG is N479EV, the Evergreen Supertanker.
int cgaft(float fCG, float fCGAftLimit) { char szCG[8], szCGAftLimit[8]; if (fCG>fCGAftLimit) { if (!bUseRoundedCG) return(1); sprintf(szCG,"%6.1f",fCG); sprintf(szCGAftLimit,"%6.1f",fCGAftLimit); if (strcmp(szCG,szCGAftLimit)) return(1); } return(0); }
There is an equivalent cgfwd() function for checking the CG against the forward limit.