void FGSensor::Noise(void) { double random_value=0.0; if (DistributionType == eUniform) { random_value = 2.0*(((double)rand()/(double)RAND_MAX) - 0.5); } else { random_value = GaussianRandomNumber(); } switch( NoiseType ) { case ePercent: Output *= (1.0 + noise_variance*random_value); break; case eAbsolute: Output += noise_variance*random_value; break; } }
double FGFunction::GetValue(void) const { unsigned int i; double scratch; if (cached) return cachedValue; double temp = Parameters[0]->GetValue(); switch (Type) { case eTopLevel: break; case eProduct: for (i=1;i<Parameters.size();i++) { temp *= Parameters[i]->GetValue(); } break; case eDifference: for (i=1;i<Parameters.size();i++) { temp -= Parameters[i]->GetValue(); } break; case eSum: for (i=1;i<Parameters.size();i++) { temp += Parameters[i]->GetValue(); } break; case eQuotient: temp /= Parameters[1]->GetValue(); break; case ePow: temp = pow(temp,Parameters[1]->GetValue()); break; case eExp: temp = exp(temp); break; case eAbs: temp = fabs(temp); break; case eSin: temp = sin(temp); break; case eCos: temp = cos(temp); break; case eTan: temp = tan(temp); break; case eACos: temp = acos(temp); break; case eASin: temp = asin(temp); break; case eATan: temp = atan(temp); break; case eATan2: temp = atan2(temp, Parameters[1]->GetValue()); break; case eMod: temp = ((int)temp) % ((int) Parameters[1]->GetValue()); break; case eMin: for (i=1;i<Parameters.size();i++) { if (Parameters[i]->GetValue() < temp) temp = Parameters[i]->GetValue(); } break; case eMax: for (i=1;i<Parameters.size();i++) { if (Parameters[i]->GetValue() > temp) temp = Parameters[i]->GetValue(); } break; case eAvg: for (i=1;i<Parameters.size();i++) { temp += Parameters[i]->GetValue(); } temp /= Parameters.size(); break; case eFrac: temp = modf(temp, &scratch); break; case eInteger: modf(temp, &scratch); temp = scratch; break; case eRandom: temp = GaussianRandomNumber(); break; default: cerr << "Unknown function operation type" << endl; break; } return temp; }