diff options
Diffstat (limited to 'contrib/gdtoa/test/dt.c')
-rw-r--r-- | contrib/gdtoa/test/dt.c | 277 |
1 files changed, 0 insertions, 277 deletions
diff --git a/contrib/gdtoa/test/dt.c b/contrib/gdtoa/test/dt.c deleted file mode 100644 index ed0daeb..0000000 --- a/contrib/gdtoa/test/dt.c +++ /dev/null @@ -1,277 +0,0 @@ -/**************************************************************** - -The author of this software is David M. Gay. - -Copyright (C) 1998 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 strtod and dtoa. - * - * Inputs (on stdin): - * number[: mode [ndigits]] - * or - * #hex0 hex1[: mode [ndigits]] - * where number is a decimal floating-point number, - * hex0 is a string of Hex digits for the most significant - * word of the number, hex1 is a similar string for the other - * (least significant) word, and mode and ndigits are - * parameters to dtoa. - */ - -#include <stdio.h> -#include "gdtoa.h" -#ifdef KR_headers -#define Void /*void*/ -#else -#define Void void -#endif - -#ifdef __STDC__ -#include <stdlib.h> -#else -#ifdef __cplusplus -extern "C" double atof(const char*); -#else -extern double atof ANSI((char*)); -#endif -#endif -#ifdef IEEE_8087 -#define word0(x) ((ULong *)&x)[1] -#define word1(x) ((ULong *)&x)[0] -#else -#define word0(x) ((ULong *)&x)[0] -#define word1(x) ((ULong *)&x)[1] -#endif -#include "errno.h" - -#ifdef __cplusplus -extern "C" char *dtoa(double, int, int, int*, int*, char **); -#else -extern char *dtoa ANSI((double, int, int, int*, int*, char **)); -#endif - - static void -#ifdef KR_headers -g_fmt(b, x) char *b; double x; -#else -g_fmt(char *b, double x) -#endif -{ - char *s, *se; - int decpt, i, j, k, sign; - - if (!x) { - *b++ = '0'; - *b = 0; - return; - } - s = dtoa(x, 0, 0, &decpt, &sign, &se); - if (sign) - *b++ = '-'; - if (decpt == 9999) /* Infinity or Nan */ { - while(*b++ = *s++); - return; - } - if (decpt <= -4 || decpt > se - s + 5) { - *b++ = *s++; - if (*s) { - *b++ = '.'; - while(*b = *s++) - b++; - } - *b++ = 'e'; - /* sprintf(b, "%+.2d", decpt - 1); */ - if (--decpt < 0) { - *b++ = '-'; - decpt = -decpt; - } - else - *b++ = '+'; - for(j = 2, k = 10; 10*k <= decpt; j++, k *= 10){}; - for(;;) { - i = decpt / k; - *b++ = i + '0'; - if (--j <= 0) - break; - decpt -= i*k; - decpt *= 10; - } - *b = 0; - } - else if (decpt <= 0) { - *b++ = '.'; - for(; decpt < 0; decpt++) - *b++ = '0'; - while(*b++ = *s++); - } - else { - while(*b = *s++) { - b++; - if (--decpt == 0 && *s) - *b++ = '.'; - } - for(; decpt > 0; decpt--) - *b++ = '0'; - *b = 0; - } - } - - static void -baderrno(Void) -{ - fflush(stdout); - perror("\nerrno strtod"); - fflush(stderr); - } - -#define U (unsigned long) - - static void -#ifdef KR_headers -check(d) double d; -#else -check(double d) -#endif -{ - char buf[64]; - int decpt, sign; - char *s, *se; - double d1; - - s = dtoa(d, 0, 0, &decpt, &sign, &se); - sprintf(buf, "%s%s%se%d", sign ? "-" : "", - decpt == 9999 ? "" : ".", s, decpt); - errno = 0; - d1 = strtod(buf, (char **)0); - if (errno) - baderrno(); - if (d != d1) { - printf("sent d = %.17g = 0x%lx %lx, buf = %s\n", - d, U word0(d), U word1(d), buf); - printf("got d1 = %.17g = 0x%lx %lx\n", - d1, U word0(d1), U word1(d1)); - } - } - - int -main(Void){ - char buf[2048], buf1[32]; - char *fmt, *s, *s1, *se; - double d, d1; - int decpt, sign; - int mode = 0, ndigits = 17; - ULong x, y; -#ifdef VAX - ULong z; -#endif - - while(fgets(buf, sizeof(buf), stdin)) { - if (*buf == '*') { - printf("%s", buf); - continue; - } - printf("Input: %s", buf); - if (*buf == '#') { - x = word0(d); - y = word1(d); - /* sscanf(buf+1, "%lx %lx:%d %d", &x, &y, &mode, &ndigits); */ - x = (ULong)strtoul(s1 = buf+1, &se, 16); - if (se > s1) { - y = (ULong)strtoul(s1 = se, &se, 16); - if (se > s1) - sscanf(se, ":%d %d", &mode, &ndigits); - } - word0(d) = x; - word1(d) = y; - fmt = "Output: d =\n%.17g = 0x%lx %lx\n"; - } - else { - errno = 0; - d = strtod(buf,&se); - if (*se == ':') - sscanf(se+1,"%d %d", &mode, &ndigits); - d1 = atof(buf); - fmt = "Output: d =\n%.17g = 0x%lx %lx, se = %s"; - if (errno) - baderrno(); - } - printf(fmt, d, U word0(d), U word1(d), se); - g_fmt(buf1, d); - printf("\tg_fmt gives \"%s\"\n", buf1); - if (*buf != '#' && d != d1) - printf("atof gives\n\ - d1 = %.17g = 0x%lx %lx\nversus\n\ - d = %.17g = 0x%lx %lx\n", d1, U word0(d1), U word1(d1), - d, U word0(d), U word1(d)); - check(d); - s = dtoa(d, mode, ndigits, &decpt, &sign, &se); - printf("\tdtoa(mode = %d, ndigits = %d):\n", mode, ndigits); - printf("\tdtoa returns sign = %d, decpt = %d, %d digits:\n%s\n", - sign, decpt, se-s, s); - x = word1(d); - if (x != 0xffffffff - && (word0(d) & 0x7ff00000) != 0x7ff00000) { -#ifdef VAX - z = x << 16 | x >> 16; - z++; - z = z << 16 | z >> 16; - word1(d) = z; -#else - word1(d) = x + 1; -#endif - printf("\tnextafter(d,+Inf) = %.17g = 0x%lx %lx:\n", - d, U word0(d), U word1(d)); - g_fmt(buf1, d); - printf("\tg_fmt gives \"%s\"\n", buf1); - s = dtoa(d, mode, ndigits, &decpt, &sign, &se); - printf( - "\tdtoa returns sign = %d, decpt = %d, %d digits:\n%s\n", - sign, decpt, se-s, s); - check(d); - } - if (x) { -#ifdef VAX - z = x << 16 | x >> 16; - z--; - z = z << 16 | z >> 16; - word1(d) = z; -#else - word1(d) = x - 1; -#endif - printf("\tnextafter(d,-Inf) = %.17g = 0x%lx %lx:\n", - d, U word0(d), U word1(d)); - g_fmt(buf1, d); - printf("\tg_fmt gives \"%s\"\n", buf1); - s = dtoa(d, mode, ndigits, &decpt, &sign, &se); - printf( - "\tdtoa returns sign = %d, decpt = %d, %d digits:\n%s\n", - sign, decpt, se-s, s); - check(d); - } - } - return 0; - } |