void CPositionOrbit::GetXYZ(double & x, double & y, double & z) { // Local variables (mostly renaming mParams variables for convenience). // Remember to convert the angular parameters into radians. double l1, l2, m1, m2, n1, n2; double inc = mParams[0] * PI / 180.0; double Omega = mParams[1] * PI / 180.0; double omega = mParams[2] * PI / 180.0; double alpha = mParams[3]; double e = mParams[4]; double tau = mParams[5]; double T = mParams[6]; double t = mTime; // Pre-compute a few values double n = ComputeN(T); double M = ComputeM(tau, n, t); double E = ComputeE(M, e); double cos_E = cos(E); double sin_E = sin(E); double beta = sqrt(1 - e*e); // Now compute the orbital coefficients Compute_Coefficients(Omega, inc, omega, l1, m1, n1, l2, m2, n2); Compute_xyz(alpha, beta, e, l1, l2, m1, m2, n1, n2, cos_E, sin_E, x, y, z); }
void exp(RR& res, const RR& x) { if (x >= NTL_OVFBND || x <= -NTL_OVFBND) Error("RR: overflow"); long p = RR::precision(); // step 0: write x = n + f, n an integer and |f| <= 1/2 // careful -- we want to compute f to > p bits of precision RR f, nn; RR::SetPrecision(NTL_BITS_PER_LONG); round(nn, x); RR::SetPrecision(p + 10); sub(f, x, nn); long n = to_long(nn); // step 1: calculate t1 = e^n by repeated squaring RR::SetPrecision(p + NumBits(n) + 10); RR e; ComputeE(e); RR::SetPrecision(p + 10); RR t1; power(t1, e, n); // step 2: calculate t2 = e^f using Taylor series expansion RR::SetPrecision(p + NumBits(p) + 10); RR t2, s, s1, t; long i; s = 0; t = 1; for (i = 1; ; i++) { add(s1, s, t); if (s == s1) break; xcopy(s, s1); mul(t, t, f); div(t, t, i); } xcopy(t2, s); RR::SetPrecision(p); mul(res, t1, t2); }