Import David Gay's gdtoa library.
* mingwex/gdtoa: New directory.
* mingwex/gdtoa/(arithchk.c, dmisc.c, dtoa.c, g__fmt.c, g_dfmt.c,
g_ffmt.c, g_xfmt.c, gd_arith.h, gd_qnan.h, gdtoa.c, gdtoa.h,
gdtoaimp.h, gethex.c, gmisc.c, hd_init.c, hexnan.c, misc.c, qnan.c,
README, smisc.c, strtodg.c, strtodnrp.c, strtof.c, strtopx.c, sum.c,
ulp.c): New files.
* mingwex/(strtof.c, strtold.c, ldtoa.c): Remove files.
* mingwex/math/(cephes-emath.c, cephes-emath.h): Remove files.
* mingwex/mb_wc_common.h (get_cp_from_locale); Rename to get_codepage().
* mingwex/(btowc.c, wctob.c, mbrtowc.c, wcrtomb.c): Adjust call to get_codepage().
* mingwex/wcstold.c: Avoid using strtold internals.
* mingwex/wcstof.c: Rewrite.
* mingwex/Makefile.in (GDTOA_DISTFILES): Add to distribution.
(GDTOA_OBJS): Add to library.
(DISTFILES): Remove strtof.c strtold.c ldtoa.c cephes-emath.c cephes-emath.h.
(STDLIB_OBJS): Remove.
(STDLIB_STUB_OBJS): Remove strtof.o wcstof,o.
(Q8_OBJS): Add wcstof.o wcstold.o.
* include/stdlib.h (strtof): Remove inline definition.
(wcstof): Likewise.
* include/wchar.h (wcstof): Remove inline definition.
2006-09-01 07:48:56 +08:00
|
|
|
/****************************************************************
|
|
|
|
|
|
|
|
The author of this software is David M. Gay.
|
|
|
|
|
|
|
|
Copyright (C) 2005 by David M. Gay
|
|
|
|
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
|
|
|
|
the author or any of his current or former employers not be used in
|
|
|
|
advertising or publicity pertaining to distribution of the software
|
|
|
|
without specific, written prior permission.
|
|
|
|
|
|
|
|
THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
|
|
|
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
|
|
|
|
NO EVENT SHALL THE AUTHOR OR ANY OF HIS CURRENT OR FORMER EMPLOYERS 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 "."). */
|
|
|
|
|
|
|
|
/* Program to compute quiet NaNs of various precisions (float, */
|
|
|
|
/* double, and perhaps long double) on the current system, */
|
|
|
|
/* provided the system uses binary IEEE (P754) arithmetic. */
|
|
|
|
/* Note that one system's quiet NaN may be a signaling NaN on */
|
|
|
|
/* another system. The IEEE arithmetic standards (P754, P854) */
|
|
|
|
/* do not specify how to distinguish signaling NaNs from quiet */
|
|
|
|
/* ones, and this detail varies across systems. The computed */
|
|
|
|
/* NaN values are encoded in #defines for values for an */
|
|
|
|
/* unsigned 32-bit integer type, called Ulong below, and */
|
|
|
|
/* (for long double) perhaps as unsigned short values. Once */
|
|
|
|
/* upon a time, there were PC compilers for Intel CPUs that */
|
|
|
|
/* had sizeof(long double) = 10. Are such compilers still */
|
|
|
|
/* distributed? */
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include "gd_arith.h"
|
|
|
|
|
|
|
|
#ifndef Long
|
|
|
|
#define Long long
|
|
|
|
#endif
|
|
|
|
|
|
|
|
typedef unsigned Long Ulong;
|
|
|
|
|
|
|
|
#undef HAVE_IEEE
|
|
|
|
#ifdef IEEE_8087
|
|
|
|
#define _0 1
|
|
|
|
#define _1 0
|
|
|
|
#define HAVE_IEEE
|
|
|
|
#endif
|
|
|
|
#ifdef IEEE_MC68k
|
|
|
|
#define _0 0
|
|
|
|
#define _1 1
|
|
|
|
#define HAVE_IEEE
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define UL (unsigned long)
|
|
|
|
|
|
|
|
int
|
|
|
|
main(void)
|
|
|
|
{
|
|
|
|
#ifdef HAVE_IEEE
|
|
|
|
typedef union {
|
|
|
|
float f;
|
|
|
|
double d;
|
|
|
|
Ulong L[4];
|
|
|
|
#ifndef NO_LONG_LONG
|
2009-07-13 06:44:37 +08:00
|
|
|
/* need u[8] instead of u[5] for 64 bit */
|
|
|
|
unsigned short u[8];
|
Import David Gay's gdtoa library.
* mingwex/gdtoa: New directory.
* mingwex/gdtoa/(arithchk.c, dmisc.c, dtoa.c, g__fmt.c, g_dfmt.c,
g_ffmt.c, g_xfmt.c, gd_arith.h, gd_qnan.h, gdtoa.c, gdtoa.h,
gdtoaimp.h, gethex.c, gmisc.c, hd_init.c, hexnan.c, misc.c, qnan.c,
README, smisc.c, strtodg.c, strtodnrp.c, strtof.c, strtopx.c, sum.c,
ulp.c): New files.
* mingwex/(strtof.c, strtold.c, ldtoa.c): Remove files.
* mingwex/math/(cephes-emath.c, cephes-emath.h): Remove files.
* mingwex/mb_wc_common.h (get_cp_from_locale); Rename to get_codepage().
* mingwex/(btowc.c, wctob.c, mbrtowc.c, wcrtomb.c): Adjust call to get_codepage().
* mingwex/wcstold.c: Avoid using strtold internals.
* mingwex/wcstof.c: Rewrite.
* mingwex/Makefile.in (GDTOA_DISTFILES): Add to distribution.
(GDTOA_OBJS): Add to library.
(DISTFILES): Remove strtof.c strtold.c ldtoa.c cephes-emath.c cephes-emath.h.
(STDLIB_OBJS): Remove.
(STDLIB_STUB_OBJS): Remove strtof.o wcstof,o.
(Q8_OBJS): Add wcstof.o wcstold.o.
* include/stdlib.h (strtof): Remove inline definition.
(wcstof): Likewise.
* include/wchar.h (wcstof): Remove inline definition.
2006-09-01 07:48:56 +08:00
|
|
|
long double D;
|
|
|
|
#endif
|
|
|
|
} U;
|
|
|
|
U a, b, c;
|
|
|
|
int i;
|
2009-07-13 06:44:37 +08:00
|
|
|
a.L[0]=a.L[1]=a.L[2]=a.L[3]=0;
|
|
|
|
b.L[0]=b.L[1]=b.L[2]=b.L[3]=0;
|
|
|
|
c.L[0]=c.L[1]=c.L[2]=c.L[3]=0;
|
Import David Gay's gdtoa library.
* mingwex/gdtoa: New directory.
* mingwex/gdtoa/(arithchk.c, dmisc.c, dtoa.c, g__fmt.c, g_dfmt.c,
g_ffmt.c, g_xfmt.c, gd_arith.h, gd_qnan.h, gdtoa.c, gdtoa.h,
gdtoaimp.h, gethex.c, gmisc.c, hd_init.c, hexnan.c, misc.c, qnan.c,
README, smisc.c, strtodg.c, strtodnrp.c, strtof.c, strtopx.c, sum.c,
ulp.c): New files.
* mingwex/(strtof.c, strtold.c, ldtoa.c): Remove files.
* mingwex/math/(cephes-emath.c, cephes-emath.h): Remove files.
* mingwex/mb_wc_common.h (get_cp_from_locale); Rename to get_codepage().
* mingwex/(btowc.c, wctob.c, mbrtowc.c, wcrtomb.c): Adjust call to get_codepage().
* mingwex/wcstold.c: Avoid using strtold internals.
* mingwex/wcstof.c: Rewrite.
* mingwex/Makefile.in (GDTOA_DISTFILES): Add to distribution.
(GDTOA_OBJS): Add to library.
(DISTFILES): Remove strtof.c strtold.c ldtoa.c cephes-emath.c cephes-emath.h.
(STDLIB_OBJS): Remove.
(STDLIB_STUB_OBJS): Remove strtof.o wcstof,o.
(Q8_OBJS): Add wcstof.o wcstold.o.
* include/stdlib.h (strtof): Remove inline definition.
(wcstof): Likewise.
* include/wchar.h (wcstof): Remove inline definition.
2006-09-01 07:48:56 +08:00
|
|
|
|
|
|
|
a.L[0] = b.L[0] = 0x7f800000;
|
|
|
|
c.f = a.f - b.f;
|
|
|
|
printf("#define f_QNAN 0x%lx\n", UL c.L[0]);
|
|
|
|
a.L[_0] = b.L[_0] = 0x7ff00000;
|
|
|
|
a.L[_1] = b.L[_1] = 0;
|
|
|
|
c.d = a.d - b.d; /* quiet NaN */
|
|
|
|
printf("#define d_QNAN0 0x%lx\n", UL c.L[0]);
|
|
|
|
printf("#define d_QNAN1 0x%lx\n", UL c.L[1]);
|
|
|
|
#ifdef NO_LONG_LONG
|
|
|
|
for(i = 0; i < 4; i++)
|
|
|
|
printf("#define ld_QNAN%d 0xffffffff\n", i);
|
|
|
|
for(i = 0; i < 5; i++)
|
|
|
|
printf("#define ldus_QNAN%d 0xffff\n", i);
|
|
|
|
#else
|
|
|
|
b.D = c.D = a.d;
|
|
|
|
if (printf("") < 0)
|
|
|
|
c.D = 37; /* never executed; just defeat optimization */
|
|
|
|
a.L[2] = a.L[3] = 0;
|
|
|
|
a.D = b.D - c.D;
|
|
|
|
for(i = 0; i < 4; i++)
|
|
|
|
printf("#define ld_QNAN%d 0x%lx\n", i, UL a.L[i]);
|
|
|
|
for(i = 0; i < 5; i++)
|
|
|
|
printf("#define ldus_QNAN%d 0x%x\n", i, a.u[i]);
|
|
|
|
#endif
|
|
|
|
#endif /* HAVE_IEEE */
|
|
|
|
return 0;
|
|
|
|
}
|