diff options
Diffstat (limited to 'gdtoa/test/dtest.c')
-rw-r--r-- | gdtoa/test/dtest.c | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/gdtoa/test/dtest.c b/gdtoa/test/dtest.c new file mode 100644 index 0000000..adcbfd1 --- /dev/null +++ b/gdtoa/test/dtest.c @@ -0,0 +1,139 @@ +/**************************************************************** + +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 (dmg at acm dot org, + * with " at " changed at "@" and " dot " changed to "."). */ + +/* Test program for g_dfmt, strtoId, strtod, strtopd, and strtord. + * + * Inputs (on stdin): + * r rounding_mode + * n ndig + * number + * #hex0 hex1 + * + * 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 Hex <= 8 digits for the most significant + * word of the number, hex1 is a similar string for the other + * (least significant) word, and ndig is a parameters to g_dfmt. + */ + +#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) + + int +main(Void) +{ + char *s, *se, *se1; + double f1, fI[2]; + int i, i1, ndig = 0, r = 1; + long LL[2]; + union { double f; ULong L[2]; } u; + + while( (s = fgets(ibuf, sizeof(ibuf), stdin)) !=0) { + while(*s <= ' ') + if (!*s++) + continue; + 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] = u.L[_0]; + LL[1] = u.L[_1]; + sscanf(s+1, "%lx %lx", &LL[0], &LL[1]); + u.L[_0] = LL[0]; + u.L[_1] = LL[1]; + printf("\nInput: %s", ibuf); + printf("--> f = #%lx %lx\n", (long)u.L[_0], (long)u.L[_1]); + goto fmt_test; + } + printf("\nInput: %s", ibuf); + i = strtord(ibuf, &se, r, &u.f); + if (r == 1) { + if ((u.f != strtod(ibuf, &se1) || se1 != se)) + printf("***strtod and strtord disagree!!\n"); + i1 = strtopd(ibuf, &se, &f1); + if (i != i1 || u.f != f1 || se != se1) + printf("***strtord and strtopd disagree!!\n"); + } + printf("strtod consumes %d bytes and returns %d with f = %.17g = #%lx %lx\n", + (int)(se-ibuf), i, u.f, U u.L[_0], U u.L[_1]); + fmt_test: + se = g_dfmt(obuf, &u.f, ndig, sizeof(obuf)); + printf("g_dfmt(%d) gives %d bytes: \"%s\"\n\n", + ndig, (int)(se-obuf), se ? obuf : "<null>"); + if (*s == '#') + continue; + printf("strtoId returns %d,", strtoId(ibuf, &se, fI, &fI[1])); + printf(" consuming %d bytes.\n", (int)(se-ibuf)); + if (fI[0] == fI[1]) { + if (fI[0] == u.f) + printf("fI[0] == fI[1] == strtod\n"); + else + printf("fI[0] == fI[1] = #%lx %lx = %.17g\n", + U ((ULong*)fI)[_0], U ((ULong*)fI)[_1], + fI[0]); + } + else { + printf("fI[0] = #%lx %lx = %.17g\n", + U ((ULong*)fI)[_0], U ((ULong*)fI)[_1], fI[0]); + printf("fI[1] = #%lx %lx = %.17g\n", + U ((ULong*)&fI[1])[_0], U ((ULong*)&fI[1])[_1], + fI[1]); + if (fI[0] == u.f) + printf("fI[0] == strtod\n"); + else if (fI[1] == u.f) + printf("fI[1] == strtod\n"); + else + printf("**** Both differ from strtod ****\n"); + } + printf("\n"); + } + return 0; + } |