1
0
mirror of https://github.com/openbsd/src.git synced 2025-01-10 06:47:55 -08:00

Use more libm.

adj360() is a modulo operation: use fmod(3) to simplify things.

Adding 0.5 to the phase to steer implicit truncation is a hack:
use lround(3) to simplify things.

Product of a discussion with pjanzen@/jca@/tb@ regarding floating-point
rounding and the importance of correctly classifying a gibbous moon.

ok pjanzen@ jca@ tb@
This commit is contained in:
cheloha 2017-12-24 16:59:50 +00:00
parent c90c9c4f6d
commit b1a8839e5d

View File

@ -1,4 +1,4 @@
/* $OpenBSD: pom.c,v 1.26 2017/12/23 20:53:07 cheloha Exp $ */
/* $OpenBSD: pom.c,v 1.27 2017/12/24 16:59:50 cheloha Exp $ */
/* $NetBSD: pom.c,v 1.6 1996/02/06 22:47:29 jtc Exp $ */
/*
@ -96,28 +96,24 @@ main(int argc, char *argv[])
/* Selected time could be before EPOCH */
for (cnt = GMT->tm_year; cnt < EPOCH; ++cnt)
days -= isleap(cnt + 1900) ? 366 : 365;
today = potm(days) + 0.5;
today = potm(days);
(void)printf("The Moon is ");
if ((int)today == 100)
if (lround(today) == 100)
(void)printf("Full\n");
else if (!(int)today)
else if (lround(today) == 0)
(void)printf("New\n");
else {
tomorrow = potm(days + 1);
if ((int)today == 50)
if (lround(today) == 50)
(void)printf("%s\n", tomorrow > today ?
"at the First Quarter" : "at the Last Quarter");
/* today is 0.5 too big, but it doesn't matter here
* since the phase is changing fast enough
*/
else {
today -= 0.5; /* Now it might matter */
(void)printf("%s ", tomorrow > today ?
"Waxing" : "Waning");
if (today > 50)
if (today > 50.0)
(void)printf("Gibbous (%1.0f%% of Full)\n",
today);
else if (today < 50)
else /* (today < 50.0) */
(void)printf("Crescent (%1.0f%% of Full)\n",
today);
}
@ -178,13 +174,9 @@ dtor(double deg)
void
adj360(double *deg)
{
for (;;)
if (*deg < 0.0)
*deg += 360.0;
else if (*deg > 360.0)
*deg -= 360.0;
else
break;
*deg = fmod(*deg, 360.0);
if (*deg < 0.0)
*deg += 360.0;
}
#define ATOI2(ar) ((ar)[0] - '0') * 10 + ((ar)[1] - '0'); (ar) += 2;