diff options
author | Jon Lund Steffensen <jonlst@gmail.com> | 2009-12-28 14:59:41 +0100 |
---|---|---|
committer | Jon Lund Steffensen <jonlst@gmail.com> | 2009-12-28 14:59:41 +0100 |
commit | 8595c4887e12b208baa41ed56c6b1885ab48b0e8 (patch) | |
tree | 6d12677a73f3799452484329d248bb32a910bb69 /src/solar.c | |
parent | Continously change color temperature (Add -o for one shot mode). (diff) | |
download | redshift-ng-8595c4887e12b208baa41ed56c6b1885ab48b0e8.tar.gz redshift-ng-8595c4887e12b208baa41ed56c6b1885ab48b0e8.tar.bz2 redshift-ng-8595c4887e12b208baa41ed56c6b1885ab48b0e8.tar.xz |
Use struct timespec instead of time_t for increased time precision.
Diffstat (limited to 'src/solar.c')
-rw-r--r-- | src/solar.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/src/solar.c b/src/solar.c index 2d66fff..5029872 100644 --- a/src/solar.c +++ b/src/solar.c @@ -47,17 +47,22 @@ static const double time_angle[] = { /* Unix time from Julian day */ -static time_t -unix_time_from_jd(double jd) +static struct timespec +timespec_from_jd(double jd) { - return 86400.0*(jd - 2440587.5); + struct timespec t; + double secs = 86400.0*(jd - 2440587.5); + t.tv_sec = floor(secs); + t.tv_nsec = (secs - t.tv_sec) * 1000000000.0; + return t; } /* Julian day from unix time */ static double -jd_from_unix_time(time_t t) +jd_from_timespec(struct timespec t) { - return (t / 86400.0) + 2440587.5; + return (t.tv_sec / 86400.0) + + (t.tv_nsec / 86400000000000.0) + 2440587.5; } /* Julian centuries since J2000.0 from Julian day */ @@ -283,17 +288,17 @@ solar_elevation_from_time(double t, double lat, double lon) } double -solar_elevation(time_t date, double lat, double lon) +solar_elevation(struct timespec date, double lat, double lon) { - double jd = jd_from_unix_time(date); + double jd = jd_from_timespec(date); return DEG(solar_elevation_from_time(jcent_from_jd(jd), lat, lon)); } void -solar_table_fill(time_t date, double lat, double lon, time_t *table) +solar_table_fill(struct timespec date, double lat, double lon, time_t *table) { /* Calculate Julian day */ - double jd = jd_from_unix_time(date); + double jd = jd_from_timespec(date); /* Calculate Julian day number */ double jdn = round(jd); @@ -303,16 +308,16 @@ solar_table_fill(time_t date, double lat, double lon, time_t *table) double sol_noon = time_of_solar_noon(t, lon); double j_noon = jdn - 0.5 + sol_noon/1440.0; double t_noon = jcent_from_jd(j_noon); - table[SOLAR_TIME_NOON] = unix_time_from_jd(j_noon); + table[SOLAR_TIME_NOON] = timespec_from_jd(j_noon).tv_sec; /* Calculate solar midnight */ - table[SOLAR_TIME_MIDNIGHT] = unix_time_from_jd(j_noon + 0.5); + table[SOLAR_TIME_MIDNIGHT] = timespec_from_jd(j_noon + 0.5).tv_sec; /* Calulate absoute time of other phenomena */ for (int i = 2; i < SOLAR_TIME_MAX; i++) { double angle = time_angle[i]; double offset = time_of_solar_elevation(t, t_noon, lat, lon, angle); - table[i] = unix_time_from_jd(jdn - 0.5 + offset/1440.0); + table[i] = timespec_from_jd(jdn - 0.5 + offset/1440.0).tv_sec; } } |