Improve pi cache

Explicitly initialize static pi cache.
Use enums to identify pi cache elements.
Verify pi cache elements used have useful values.
This commit is contained in:
Landon Curt Noll
2021-09-07 06:30:21 -07:00
parent 45665f94a7
commit 7c0ebc5887

View File

@@ -53,16 +53,23 @@ STATIC NUMBER *ln_10_epsilon = NULL;
* pivalue[LAST_PI_EPSILON] - last epsilon used to calculate pi * pivalue[LAST_PI_EPSILON] - last epsilon used to calculate pi
* pivalue[LAST_PI_VALUE] - last calculated pi * pivalue[LAST_PI_VALUE] - last calculated pi
* given pivalue[LAST_PI_EPSILON] epsilon * given pivalue[LAST_PI_EPSILON] epsilon
* pivalue[LAST_PI_DIV_180_EPSILON] last epsilon used to calculate pi/180 * pivalue[LAST_PI_DIV_180_EPSILON] - last epsilon used to calculate pi/180
* pivalue[LAST_PI_DIV_180] - last calculated pi/180 given * pivalue[LAST_PI_DIV_180_VALUE] - last calculated pi/180 given
* pivalue[LAST_PI_DIV_180_EPSILON] epsilon * pivalue[LAST_PI_DIV_180_EPSILON] epsilon
*/ */
#define PI_CACHE_LEN (4) enum pi_cache {
#define LAST_PI_EPSILON (0) LAST_PI_EPSILON = 0,
#define LAST_PI_VALUE (1) LAST_PI_VALUE,
#define LAST_PI_DIV_180_EPSILON (2) LAST_PI_DIV_180_EPSILON,
#define LAST_PI_DIV_180 (3) LAST_PI_DIV_180_VALUE,
STATIC NUMBER *pivalue[PI_CACHE_LEN]; PI_CACHE_LEN /* must be last */
};
STATIC NUMBER *pivalue[PI_CACHE_LEN] = {
NULL, /* LAST_PI_EPSILON */
NULL, /* LAST_PI_VALUE */
NULL, /* LAST_PI_DIV_180_EPSILON */
NULL, /* LAST_PI_DIV_180_VALUE */
};
/* /*
* other static function decls * other static function decls
@@ -751,13 +758,15 @@ qpi(NUMBER *epsilon)
} }
/* use pi cache if epsilon marches, else flush if needed */ /* use pi cache if epsilon marches, else flush if needed */
if (epsilon == pivalue[LAST_PI_EPSILON]) { if (pivalue[LAST_PI_EPSILON] != NULL &&
pivalue[LAST_PI_VALUE] != NULL &&
epsilon == pivalue[LAST_PI_EPSILON]) {
return qlink(pivalue[LAST_PI_VALUE]); return qlink(pivalue[LAST_PI_VALUE]);
} }
if (pivalue[LAST_PI_EPSILON]) { if (pivalue[LAST_PI_EPSILON] != NULL) {
qfree(pivalue[LAST_PI_EPSILON]); qfree(pivalue[LAST_PI_EPSILON]);
} }
if (pivalue[LAST_PI_VALUE]) { if (pivalue[LAST_PI_VALUE] != NULL) {
qfree(pivalue[LAST_PI_VALUE]); qfree(pivalue[LAST_PI_VALUE]);
} }
@@ -817,25 +826,27 @@ qpidiv180(NUMBER *epsilon)
} }
/* use pi/180 cache if epsilon marches, else flush if needed */ /* use pi/180 cache if epsilon marches, else flush if needed */
if (epsilon == pivalue[LAST_PI_DIV_180_EPSILON]) { if (pivalue[LAST_PI_DIV_180_EPSILON] != NULL &&
return qlink(pivalue[LAST_PI_DIV_180]); pivalue[LAST_PI_DIV_180_VALUE] != NULL &&
epsilon == pivalue[LAST_PI_DIV_180_EPSILON]) {
return qlink(pivalue[LAST_PI_DIV_180_VALUE]);
} }
if (pivalue[LAST_PI_DIV_180_EPSILON]) { if (pivalue[LAST_PI_DIV_180_EPSILON] != NULL) {
qfree(pivalue[LAST_PI_DIV_180_EPSILON]); qfree(pivalue[LAST_PI_DIV_180_EPSILON]);
} }
if (pivalue[LAST_PI_DIV_180]) { if (pivalue[LAST_PI_DIV_180_VALUE] != NULL) {
qfree(pivalue[LAST_PI_DIV_180]); qfree(pivalue[LAST_PI_DIV_180_VALUE]);
} }
/* let qpi() returned cached pi or calculate new as needed */ /* let qpi() returned cached pi or calculate new as needed */
pi = qpi(epsilon); pi = qpi(epsilon);
/* now calculate pi/180 */ /* calculate pi/180 */
pidiv180 = qdivi(pi, 180); pidiv180 = qdivi(pi, 180);
/* cache epsilon and pi/180 */ /* cache epsilon and pi/180 */
pivalue[LAST_PI_DIV_180_EPSILON] = qlink(epsilon); pivalue[LAST_PI_DIV_180_EPSILON] = qlink(epsilon);
pivalue[LAST_PI_DIV_180] = qlink(pidiv180); pivalue[LAST_PI_DIV_180_VALUE] = qlink(pidiv180);
/* return pi/180 */ /* return pi/180 */
return pidiv180; return pidiv180;