aboutsummaryrefslogtreecommitdiff
path: root/src/benchmarks/cfrac/pcmp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/benchmarks/cfrac/pcmp.c')
-rw-r--r--src/benchmarks/cfrac/pcmp.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/benchmarks/cfrac/pcmp.c b/src/benchmarks/cfrac/pcmp.c
new file mode 100644
index 0000000..2c8e0b8
--- /dev/null
+++ b/src/benchmarks/cfrac/pcmp.c
@@ -0,0 +1,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;
+}