blob: 2c8e0b85f4b4b7a06ac7db99c92fb53e613b1ac4 [file] [log] [blame]
#include "pdefs.h"
#include "precision.h"
/*
* Compare to zero (normalization not assumed)
*
* Returns same as pcmp(u, 0);
*/
int pcmpz(u)
register precision u;
{
register digitPtr uPtr;
register int i;
(void) pparm(u);
i = 0;
uPtr = u->value;
do {
if (*uPtr++ != 0) {
if (u->sign) i = -1; else i = 1;
break;
}
} while (uPtr < u->value + u->size);
pdestroy(u);
return i;
}
/*
* Compare u to v.
*
* Return: < 0 if u < v
* = 0 if u = v
* > 0 if u > v
*
* This routine is the one that assumes results are normalized!
* - no leading 0's
* - no negative 0
*/
int pcmp(u, v)
precision u, v;
{
register digitPtr uPtr, vPtr;
register int i; /* should be bigger than posit */
(void) pparm(u);
(void) pparm(v);
if (u->sign != v->sign) {
if (u->sign) i = -1; else i = 1;
} else {
i = u->size - v->size;
if (i == 0) {
uPtr = u->value + u->size;
vPtr = v->value + v->size;
do {
if (*--uPtr != *--vPtr) break;
} while (vPtr > v->value);
if (*uPtr > *vPtr) i = 1;
else if (*uPtr < *vPtr) i = -1;
}
if (u->sign) i = -i;
}
pdestroy(u);
pdestroy(v);
return i;
}