aboutsummaryrefslogtreecommitdiff
path: root/src/benchmarks/cfrac/pfloat.c
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fl.fischer@fau.de>2019-08-24 17:57:51 +0200
committerFlorian Fischer <florian.fl.fischer@fau.de>2019-08-24 17:57:51 +0200
commit77ac9ce0a5c55d4f79f8fb8f7daa59ddb53cb507 (patch)
tree93d4e30a207265af03394d347bfff76ba677f3ce /src/benchmarks/cfrac/pfloat.c
parent971adefadb94e8780b1a73f08ed11d76c2ead8a2 (diff)
downloadallocbench-77ac9ce0a5c55d4f79f8fb8f7daa59ddb53cb507.tar.gz
allocbench-77ac9ce0a5c55d4f79f8fb8f7daa59ddb53cb507.zip
add cfrac benchmark
Diffstat (limited to 'src/benchmarks/cfrac/pfloat.c')
-rw-r--r--src/benchmarks/cfrac/pfloat.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/benchmarks/cfrac/pfloat.c b/src/benchmarks/cfrac/pfloat.c
new file mode 100644
index 0000000..63f4344
--- /dev/null
+++ b/src/benchmarks/cfrac/pfloat.c
@@ -0,0 +1,61 @@
+/*
+ * High Precision Math Library Supplement for floating point routines
+ */
+#include <stdio.h>
+#include <math.h>
+#include "pdefs.h"
+#include "pcvt.h"
+#include "precision.h"
+
+extern precision palloc();
+
+/*
+ * double to precision
+ */
+precision dtop(f)
+ register double f;
+{
+ register digitPtr uPtr;
+ register precision u;
+
+ u = palloc(DOUBLESIZE); /* pretty big */
+ if (u == pUndef) return u;
+
+ if (f < 0.0) {
+ f = -f;
+ u->sign = true;
+ } else {
+ u->sign = false;
+ }
+ uPtr = u->value;
+ do {
+ *uPtr++ = fmod(f, (double) BASE);
+ f = floor(f / (double) BASE);
+ } while (f != 0.0);
+
+ u->size = (uPtr - u->value);
+
+ return presult(u);
+}
+
+/*
+ * precision to double (no overflow check)
+ */
+double ptod(u)
+ precision u;
+{
+ register digitPtr uPtr;
+ register double f;
+
+ (void) pparm(u);
+ uPtr = u->value + u->size;
+ f = 0.0;
+ do {
+ f = f * (double) BASE + (double) *--uPtr;
+ } while (uPtr > u->value);
+
+ if (u->sign) f = -f;
+
+ pdestroy(u);
+ return f;
+}