I am using version 18
I want to store up to 6 decimal places so that I can use them for future calculations. The values to be printed are coming from a GPS unit which I have stored into double values and them used them from complex calculations for which I need more accuracy that 2 decimal places.
If you want to take a look at it. My code is listed below:
if(strstr(stat,statusA)!=NULL)
{
double JD, UT, T, M_prime, M, L0_prime, L0, DL_prime, DL, L_prime, L, eps, eps_prime;
double X, Y, Z, R, RA_hrs, RA_deg, delta, delta_prime;
double GST_prime, GST, theta, tau, ha, ALT, AZ, AZ_prime;
char hh[3], ss[3], mm[3], LatDeg[3], LatMin[8], dirNS[2], LongDeg[4], LongMin[6], dirEW[2], dd[3], mo[3], yy[3];
memset(hh,'\0',3);
memset(ss,'\0',3);
memset(mm,'\0',3);
memset(LatDeg,'\0',3);
memset(LatMin,'\0',8);
memset(dirNS,'\0',2);
memset(LongDeg,'\0',4);
memset(LongMin,'\0',6);
memset(dirEW,'\0',2);
memset(dd,'\0',3);
memset(mo,'\0',3);
memset(yy,'\0',3);
strncpy(hh, linea +8, 2);
double Hour = atof(hh);
strncpy(mm, linea +10, 2);
double Min = atof(mm);
strncpy(ss, linea +12, 2);
double Sec = atof(ss);
strncpy(LatDeg, linea +17, 2);
double Lat_deg = atof(LatDeg);
strncpy(LatMin, linea +19, 7);
double Lat_min = atof(LatMin);
strncpy(dirNS, linea +27, 1);
strncpy(LongDeg, linea +29, 3);
double Long_deg = atof(LongDeg);
strncpy(LongMin, linea +32, 5);
double Long_min = atof(LongMin);
strncpy(dirEW, linea +40, 1);
strncpy(dd, linea +54, 2);
double Day = atof(dd);
strncpy(mo, linea +56, 2);
double Month = atof(mo);
strncpy(yy, linea +58, 2);
double Year = atof(yy) + 2000.0;
// Calculating Latitude and Longtitude in decimal values
double Long = Long_deg + (Long_min/60.0);
double Lat = Lat_deg + (Lat_min/60.0);
// Adjusting Latitude and Longtitude vales based on N/S and E/W direction
char testNS[] = "N";
char test2NS[] = "S";
if(strstr(dirNS,testNS)!=NULL)
{
Lat = Lat * 1.0;
}
else if(strstr(dirNS,test2NS)!=NULL)
{
Lat = Lat * -1.0;
}
char testEW[] = "E";
char test2EW[] = "W";
if(strstr(dirEW,testEW)!=NULL)
{
Long = Long * 1.0;
}
if(strstr(dirEW,test2EW)!=NULL)
{
Long = Long * -1.0;
}
// Calculating Time Zone
double TimeZone;
if (Long < 0.0)
{
TimeZone = ceil(Long/15.0);
}
else if (Long > 0.0)
{
TimeZone = floor(Long/15.0);
}
if (TimeZone == -0.0)
{
TimeZone = 0.0;
}
// Converting Gregorian calendar date to Julian Date
JD = 367.0*Year;
JD -= floor(7.0*(Year+floor((Month+9.0)/12.0))/4.0);
JD += floor(275.0*Month/9.0);
JD += Day;
JD += (Hour + (Min + Sec/60.0)/60.)/24.0;
JD += 1721013.5;
T = (JD-2451545.0) / 36525.0;
// Calculating UT based on Time Zone and given Time
//UT = (Hour - TimeZone) + (Min/60.0) + (Sec/3600.0);
UT = Hour + Min + Sec;
// Solar Coordinates Calculation, accuracy of 0.01 degree
double k = (2.0*PI)/360.0;
// mean anomaly, degree
M_prime = 357.52910 + 35999.05030*T - 0.0001559*T*T - 0.00000048*T*T*T;
if (M_prime > 0.0)
{
if (M_prime < 360.0)
{
M = M_prime;
}
else if (M_prime > 360.0)
{
double reminder;
reminder = floor(M_prime/360.0);
M = M_prime - (360.0*reminder);
}
}
else if (M_prime < 0.0)
{
if (M_prime > -360.0)
{
M = 360.0 - abs(M_prime);
}
else if (M_prime < -360.0)
{
double reminder;
reminder = floor(abs(M_prime)/360.0);
M = 360.0 - (abs(M_prime) - (360.0*reminder));
}
}
else
{
M = 0.0;
}
// mean longitude, degree
L0_prime = 280.46645 + 36000.76983*T + 0.0003032*T*T;
if (L0_prime > 0.0)
{
if (L0_prime < 360.0)
{
L0 = L0_prime;
}
else if (L0_prime > 360.0)
{
double reminder;
reminder = floor(L0_prime/360.0);
L0 = L0_prime - (360.0*reminder);
}
}
else if (L0_prime < 0.0)
{
if (L0_prime > -360.0)
{
L0 = 360.0 - abs(L0_prime);
}
else if (L0_prime < -360.0)
{
double reminder;
reminder = floor(abs(L0_prime)/360.0);
L0 = 360.0 - (abs(L0_prime) - (360.0*reminder));
}
}
else
{
L0 = 0.0;
}
DL_prime = (1.914600 - 0.004817*T - 0.000014*T*T)*sin(k*M) + (0.019993 - 0.000101*T)*sin(k*2.0*M) + 0.000290*sin(k*3.0*M);
if ( DL_prime > 0.0)
{
if (DL_prime < 360.0)
{
DL = DL_prime;
}
else if (DL_prime > 360.0)
{
double reminder;
reminder = floor(DL_prime/360.0);
DL = DL_prime - (360.0*reminder);
}
}
else if (DL_prime < 0.0)
{
if (DL_prime > -360.0)
{
DL = 360.0 - abs(DL_prime);
}
else if (DL_prime < -360.0)
{
double reminder;
reminder = floor(abs(DL_prime)/360.0);
DL = 360.0 - (abs(DL_prime) - (360.0*reminder));
}
}
else
{
DL = 0.0;
}
// true longitude, degree
L_prime = L0 + DL;
if ( L_prime > 0.0)
{
if (L_prime < 360.0)
{
L = L_prime;
}
else if (L_prime > 360.0)
{
double reminder;
reminder = floor(L_prime/360.0);
L = L_prime - (360.0*reminder);
}
}
else if (L_prime < 0.0)
{
if (L_prime > -360.0)
{
L = 360.0 - abs(L_prime);
}
else if (L_prime < -360.0)
{
double reminder;
reminder = floor(abs(L_prime)/360.0);
L = 360.0 - (abs(L_prime) - (360.0*reminder));
}
}
else
{
L = 0.0;
}
// convert ecliptic longitude L to right ascension RA and declination delta
// (the ecliptic latitude of the Sun is assumed to be zero):
// obliquity eps of ecliptic:
eps_prime = 23.0 + 26.0/60.0 + 21.448/3600.0 - (46.8150*T + 0.00059*T*T - 0.001813*T*T*T)/3600.0;
if (eps_prime > 0.0)
{
if (eps_prime < 360.0)
{
eps = eps_prime;
}
else if (eps_prime > 360.0)
{
double reminder;
reminder = floor(eps_prime/360.0);
eps = eps_prime - (360.0*reminder);
}
}
else if (eps_prime < 0.0)
{
if (eps_prime > -360.0)
{
eps = 360.0 - abs(eps_prime);
}
else if (eps_prime < -360.0)
{
double reminder;
reminder = floor(abs(eps_prime)/360.0);
eps = 360.0 - (abs(eps_prime) - (360.0*reminder));
}
}
else
{
eps = 0.0;
}
double eps2 = 23.439 - 0.013*T;
X = cos(L*k);
Y = cos(eps*k)*sin(L*k);
Z = sin(eps*k)*sin(L*k);
R = sqrt(1.0-Z*Z);
delta_prime = atan(Z/R) * 1/k; // in degrees
if (delta_prime > 0.0)
{
if (delta_prime < 360.0)
{
delta = delta_prime;
}
else if (delta_prime > 360.0)
{
double reminder;
reminder = floor(delta_prime/360.0);
delta = delta_prime - (360.0*reminder);
}
}
else if (delta_prime < 0.0)
{
if (delta_prime > -360.0)
{
delta = 360.0 - abs(delta_prime);
}
else if (delta_prime < -360.0)
{
double reminder;
reminder = floor(abs(delta_prime)/360.0);
delta = 360.0 - (abs(delta_prime) - (360.0*reminder));
}
}
else
{
delta = 0.0;
}
// calculating the declination angle in degrees
double dec = asin(Z) * 1.0/k;
// calculating the right ascension (RA) in hours and degrees
RA_hrs = (24.0/180.0) * (atan(Y/(X+R)) * 1.0/k); // in hours
RA_deg = atan(Y/X) * 1.0/k;
// adjusting the right ascension (RA) angle
if (X < 0) /*Make sure we're in the right quadrant*/
{
RA_deg = RA_deg + 180;
}
else if ((X > 0) && (Y < 0))
{
RA_deg = RA_deg + 360;
}
else
{
RA_deg = 360 + RA_deg;
}
if (RA_deg > 360)
{
RA_deg = RA_deg - 360;
}
// compute sidereal time at Greenwich
GST_prime = 280.46061837 + 360.98564736629*(JD-2451545.0) + 0.000387933*T*T - (T*T*T)/38710000.0;
if (GST_prime > 0.0)
{
if (GST_prime < 360.0)
{
GST = GST_prime;
}
else if (GST_prime > 360.0)
{
double reminder;
reminder = floor(GST_prime/360.0);
GST = GST_prime - (360.0*reminder);
}
}
else if (GST_prime < 0.0)
{
if (GST_prime > -360.0)
{
GST = 360.0 - abs(GST_prime);
}
else if (GST_prime < -360.0)
{
double reminder;
reminder = floor(abs(GST_prime)/360.0);
GST = 360.0 - (abs(GST_prime) - (360.0*reminder));
}
}
else
{
GST = 0.0;
}
theta = GST + 10.0;
tau = theta - RA_deg;
// ha = L0 - RA_deg + 180.0 + (15.0*UT) + Long;
// ha = 15.0*(12.0-Hour);
// calculating local sid. time angle
double LocST_prime, LocST;
LocST_prime = GST - (360.0 - Long);
if (LocST_prime > 0.0)
{
if (LocST_prime < 360.0)
{
LocST = LocST_prime;
}
else if (LocST_prime > 360.0)
{
double reminder;
reminder = floor(LocST_prime/360.0);
LocST = LocST_prime - (360.0*reminder);
}
}
else if (LocST_prime < 0.0)
{
if (LocST_prime > -360.0)
{
LocST = 360.0 - abs(LocST_prime);
}
else if (LocST_prime < -360.0)
{
double reminder;
reminder = floor(abs(LocST_prime)/360.0);
LocST = 360.0 - (abs(LocST_prime) - (360.0*reminder));
}
}
else
{
LocST = 0.0;
}
// calculating the local hour angle
ha = LocST - RA_deg;
if (ha < 0)
{
ha = ha + 360;
}
// double hau = 68.33;
// Calculating the final Altitude angle
ALT = asin(sin(Lat*k)*sin(dec*k) + cos(Lat*k)*cos(dec*k)*cos(ha*k)) * 1.0/k;
That is basically the core of the code... and the output is as follows in the next post