summaryrefslogtreecommitdiffstats
path: root/contrib/gdtoa/test/ddtest.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/gdtoa/test/ddtest.c')
-rw-r--r--contrib/gdtoa/test/ddtest.c183
1 files changed, 183 insertions, 0 deletions
diff --git a/contrib/gdtoa/test/ddtest.c b/contrib/gdtoa/test/ddtest.c
new file mode 100644
index 0000000..aa32e92
--- /dev/null
+++ b/contrib/gdtoa/test/ddtest.c
@@ -0,0 +1,183 @@
+/****************************************************************
+
+The author of this software is David M. Gay.
+
+Copyright (C) 1998-2001 by Lucent Technologies
+All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and
+its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that the copyright notice and this
+permission notice and warranty disclaimer appear in supporting
+documentation, and that the name of Lucent or any of its entities
+not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+
+****************************************************************/
+
+/* Please send bug reports to
+ David M. Gay
+ Bell Laboratories, Room 2C-463
+ 600 Mountain Avenue
+ Murray Hill, NJ 07974-0636
+ U.S.A.
+ dmg@bell-labs.com
+ */
+
+/* Test program for g_ddfmt, strtoIdd, strtopdd, and strtordd.
+ *
+ * Inputs (on stdin):
+ * r rounding_mode
+ * n ndig
+ * number
+ * #hex0 hex1 hex2 hex3
+ *
+ * rounding_mode values:
+ * 0 = toward zero
+ * 1 = nearest
+ * 2 = toward +Infinity
+ * 3 = toward -Infinity
+ *
+ * where number is a decimal floating-point number,
+ * hex0 is a string of <= 8 Hex digits for the most significant
+ * word of the number, hex1 is a similar string for the next
+ * word, etc., and ndig is a parameters to g_ddfmt.
+ */
+
+#include "gdtoaimp.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+ extern int getround ANSI((int,char*));
+
+ static char ibuf[2048], obuf[1024];
+
+#define U (unsigned long)
+
+ static void
+#ifdef KR_headers
+dprint(what, d) char *what; double d;
+#else
+dprint(char *what, double d)
+#endif
+{
+ char buf[32];
+ ULong *L = (ULong*)&d;
+
+ g_dfmt(buf,&d,0,sizeof(buf));
+ printf("%s = %s = #%lx %lx\n", what, buf, U L[_0], U L[_1]);
+ }
+
+ int
+main(Void)
+{
+ ULong *L;
+ char *s, *s1, *se, *se1;
+ int dItry, i, j, r = 1, ndig = 0;
+ double dd[2], ddI[4];
+ long LL[4];
+
+ L = (ULong*)&dd[0];
+ while( (s = fgets(ibuf, sizeof(ibuf), stdin)) !=0) {
+ while(*s <= ' ')
+ if (!*s++)
+ continue;
+ dItry = 0;
+ switch(*s) {
+ case 'r':
+ r = getround(r, s);
+ continue;
+ case 'n':
+ i = s[1];
+ if (i <= ' ' || i >= '0' && i <= '9') {
+ ndig = atoi(s+1);
+ continue;
+ }
+ break; /* nan? */
+ case '#':
+ LL[0] = L[_0];
+ LL[1] = L[_1];
+ LL[2] = L[2+_0];
+ LL[3] = L[2+_1];
+ sscanf(s+1, "%lx %lx %lx %lx", &LL[0], &LL[1],
+ &LL[2], &LL[3]);
+ L[_0] = LL[0];
+ L[_1] = LL[1];
+ L[2+_0] = LL[2];
+ L[2+_1] = LL[3];
+ printf("\nInput: %s", ibuf);
+ printf(" --> f = #%lx %lx %lx %lx\n",
+ LL[0],LL[1],LL[2],LL[3]);
+ goto fmt_test;
+ }
+ printf("\nInput: %s", ibuf);
+ for(s1 = s; *s1 > ' '; s1++){};
+ while(*s1 <= ' ' && *s1) s1++;
+ if (!*s1) {
+ dItry = 1;
+ i = strtordd(ibuf, &se, r, dd);
+ if (r == 1) {
+ j = strtopdd(ibuf, &se1, ddI);
+ if (i != j || dd[0] != ddI[0]
+ || dd[1] != ddI[1] || se != se1)
+ printf("***strtopdd and strtordd disagree!!\n:");
+ }
+ printf("strtopdd consumes %d bytes and returns %d\n",
+ (int)(se-ibuf), i);
+ }
+ else {
+ dd[0] = strtod(s, &se);
+ dd[1] = strtod(se, &se);
+ }
+ fmt_test:
+ dprint("dd[0]", dd[0]);
+ dprint("dd[1]", dd[1]);
+ se = g_ddfmt(obuf, dd, ndig, sizeof(obuf));
+ printf("g_ddfmt(%d) gives %d bytes: \"%s\"\n\n",
+ ndig, (int)(se-obuf), se ? obuf : "<null>");
+ if (!dItry)
+ continue;
+ printf("strtoIdd returns %d,", strtoIdd(ibuf, &se, ddI,&ddI[2]));
+ printf(" consuming %d bytes.\n", (int)(se-ibuf));
+ if (ddI[0] == ddI[2] && ddI[1] == ddI[3]) {
+ if (ddI[0] == dd[0] && ddI[1] == dd[1])
+ printf("ddI[0] == ddI[1] == strtopdd\n");
+ else
+ printf("ddI[0] == ddI[1] = #%lx %lx + %lx %lx\n= %.17g + %17.g\n",
+ U ((ULong*)ddI)[_0],
+ U ((ULong*)ddI)[_1],
+ U ((ULong*)ddI)[2+_0],
+ U ((ULong*)ddI)[2+_1],
+ ddI[0], ddI[1]);
+ }
+ else {
+ printf("ddI[0] = #%lx %lx + %lx %lx\n= %.17g + %.17g\n",
+ U ((ULong*)ddI)[_0], U ((ULong*)ddI)[_1],
+ U ((ULong*)ddI)[2+_0], U ((ULong*)ddI)[2+_1],
+ ddI[0], ddI[1]);
+ printf("ddI[1] = #%lx %lx + %lx %lx\n= %.17g + %.17g\n",
+ U ((ULong*)ddI)[4+_0], U ((ULong*)ddI)[4+_1],
+ U ((ULong*)ddI)[6+_0], U ((ULong*)ddI)[6+_1],
+ ddI[2], ddI[3]);
+ if (ddI[0] == dd[0] && ddI[1] == dd[1])
+ printf("ddI[0] == strtod\n");
+ else if (ddI[2] == dd[0] && ddI[3] == dd[1])
+ printf("ddI[1] == strtod\n");
+ else
+ printf("**** Both differ from strtopdd ****\n");
+ }
+ printf("\n");
+ }
+ return 0;
+ }
OpenPOWER on IntegriCloud