aboutsummaryrefslogtreecommitdiff
path: root/src/benchmarks/cfrac/pcmp.c
blob: 2c8e0b85f4b4b7a06ac7db99c92fb53e613b1ac4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#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;
}