aboutsummaryrefslogtreecommitdiff
path: root/src/benchmarks/cfrac/ptou.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/ptou.c
parent971adefadb94e8780b1a73f08ed11d76c2ead8a2 (diff)
downloadallocbench-77ac9ce0a5c55d4f79f8fb8f7daa59ddb53cb507.tar.gz
allocbench-77ac9ce0a5c55d4f79f8fb8f7daa59ddb53cb507.zip
add cfrac benchmark
Diffstat (limited to 'src/benchmarks/cfrac/ptou.c')
-rw-r--r--src/benchmarks/cfrac/ptou.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/benchmarks/cfrac/ptou.c b/src/benchmarks/cfrac/ptou.c
new file mode 100644
index 0000000..b8ca07b
--- /dev/null
+++ b/src/benchmarks/cfrac/ptou.c
@@ -0,0 +1,31 @@
+#include "pdefs.h"
+#include "pcvt.h"
+#include "precision.h"
+
+/*
+ * Precision to unsigned
+ */
+unsigned int ptou(u)
+ precision u;
+{
+ register digitPtr uPtr;
+ register accumulator temp;
+
+ (void) pparm(u);
+ if (u->sign) {
+ temp = (unsigned long) errorp(PDOMAIN, "ptou", "negative argument");
+ } else {
+ uPtr = u->value + u->size;
+ temp = 0;
+ do {
+ if (temp > divBase(MAXUNSIGNED - *--uPtr)) {
+ temp = (unsigned long) errorp(POVERFLOW, "ptou", "overflow");
+ break;
+ }
+ temp = mulBase(temp);
+ temp += *uPtr;
+ } while (uPtr > u->value);
+ }
+ pdestroy(u);
+ return (unsigned int) temp;
+}