Mail Archives: djgpp/2017/12/30/16:02:45
X-Authentication-Warning: | delorie.com: mail set sender to djgpp-bounces using -f
|
X-Recipient: | djgpp AT delorie DOT com
|
Message-ID: | <5A47FFEA.6030304@gmx.de>
|
Date: | Sat, 30 Dec 2017 22:06:50 +0100
|
From: | "Juan Manuel Guerrero (juan DOT guerrero AT gmx DOT de) [via djgpp AT delorie DOT com]" <djgpp AT delorie DOT com>
|
User-Agent: | Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.13) Gecko/20101206 SUSE/3.1.7 Thunderbird/3.1.7
|
MIME-Version: | 1.0
|
To: | djgpp AT delorie DOT com
|
Subject: | Implementation of frexpl.
|
X-Provags-ID: | V03:K0:XeH+mEyZNtZCdQb2kLsXGXtprYW5H+/nEYgekd9WBTz61AgpuMF
|
| jfpPC2WGtnR6pRP7TTUkbwAUsfZwUxmB1zgY4MKSDeOGNfIRN40l2aXXFekqUPCYqKDu8IF
|
| 4cJ8lYP7sEzYawy1zk2S/itKnxHyqLRKOEY5pQTg7Ik4gaYKvxfC6EmVQNreGnevJvXd4lj
|
| FdLhF/CK6ECURGDeCxTIg==
|
X-UI-Out-Filterresults: | notjunk:1;V01:K0:Mlp0/240SuE=:3O+RXDdLyv2A0hnfUGa+Hy
|
| nX094xPuLEbIhW9FR8E41p0B6z6aZzUSaopRYCquc//KYOMU31cD4pn0qhoTzkV/5rCtnwGQl
|
| xEPKafHADgwNqew5ZlnzzI8J52S0rNVaa4AbuDCCYybwIdDRtKskS9fHNmWd6mbKmMmHQiNzk
|
| jacri5WvPtR580i95KyHeUp56J1P2gsme5Y8ikN8ikeGUZHhXVVAf4FkNwBih9TgAmlFfR03V
|
| oxqTUZM8EqiKvYf5oQS7pRpfXxuAkDt0XG7j163E+oimDBO5CWobPTf+uiO9tS+0Z0grHh2xz
|
| YOz5WnqvBSB0HwGfuS8XnwApugAQPRt47mZVBKWmGve622SdMkb9VuF/D9dIwglXfP/vPt2GQ
|
| z9csvBv6KKQPGDWWmwIkMoQQyMzLc5fN72ZumJF8wL7Mi1SswoWpKa99yy09yoWZVjEwHiCSc
|
| 33RkSeFVtdP0ZBHQb1wfhVRs3jF5p7RAQ7KOEI8mgtAu0Rs93L3zp5IfzVKgAW0LWEOgcBh6I
|
| Pm9ibu7wvgOQHzIe43sXvbSlqeTZiDCMBQ0h67QlW7uBItgD9ZTcH44eS6esFeoChOzK9+YCm
|
| btPzhG+cD4tOS9r9Phx+1jo8aWzdQIo0ciwX1rrYaWfN3P1Y3NCOh/QhRadhP03HieAULQtBL
|
| n9mTmTComWGWEbACbWAQZxkcnQiJWHuK1DHeYbOy9pUxCRLPrXKEbQGIbCahY66LnaLxjs+cZ
|
| 3BPLppoVPNi5EqPpv3nbmhA9oAl0GXfMHi5/GeHXCylWLmi7JwpKHb/so6FLItfCBPBD++kx6
|
| U005gXPd3BG538KuVrZBfrbKf6rQQ==
|
Reply-To: | djgpp AT delorie DOT com
|
This is a multi-part message in MIME format.
--------------010603080109010204050001
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit
The patch below implements the missing frexpl function for libm.a.
Also a test case has been added. If I do not get any serious objection
I will commite the files in a couple of days.
Regards,
Juan M. Guerrero
diff -aprNU5 djgpp.orig/include/libm/math.h djgpp/include/libm/math.h
--- djgpp.orig/include/libm/math.h 2015-07-19 11:28:00 +0000
+++ djgpp/include/libm/math.h 2017-12-30 16:26:10 +0000
@@ -1,5 +1,6 @@
+/* Copyright (C) 2017 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 2015 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 2013 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 1998 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
/* Provided by Cygnus Support (jtc AT cygnus DOT com) */
@@ -154,10 +155,12 @@ extern double sqrt __P((double));
extern double ceil __P((double));
extern double fabs __P((double));
extern double floor __P((double));
extern double fmod __P((double, double));
+extern long double frexpl __P((long double, int *));
+
#if !defined(__STRICT_ANSI__) || defined(__cplusplus) || \
defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
/* ISO C99 types and macros. */
extern long long int llrintf __P((float));
diff -aprNU5 djgpp.orig/include/math.h djgpp/include/math.h
--- djgpp.orig/include/math.h 2015-07-18 17:07:40 +0000
+++ djgpp/include/math.h 2017-12-30 16:26:10 +0000
@@ -1,5 +1,6 @@
+/* Copyright (C) 2017 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 2015 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 2013 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 2003 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 1999 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 1998 DJ Delorie, see COPYING.DJ for details */
@@ -83,10 +84,12 @@ extern float sqrtf(float);
extern float ceilf(float);
extern float fabsf(float);
extern float floorf(float);
extern float fmodf(float, float);
+extern long double frexpl(long double, int *);
+
/* End libm.a. */
#endif
#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) \
diff -aprNU5 djgpp.orig/src/libm/math/makefile djgpp/src/libm/math/makefile
--- djgpp.orig/src/libm/math/makefile 2015-07-18 17:07:52 +0000
+++ djgpp/src/libm/math/makefile 2017-12-30 16:26:10 +0000
@@ -1,5 +1,6 @@
+# Copyright (C) 2017 DJ Delorie, see COPYING.DJ for details
# Copyright (C) 2013 DJ Delorie, see COPYING.DJ for details
# Copyright (C) 1998 DJ Delorie, see COPYING.DJ for details
TOP=..
SRC += k_standard.c
@@ -66,10 +67,11 @@ SRC += s_erf.c
SRC += s_expm1.c
SRC += s_fabs.c
SRC += s_finite.c
SRC += s_floor.c
SRC += s_frexp.c
+SRC += s_frexpl.c
SRC += s_ilogb.c
SRC += s_isnan.c
SRC += s_ldexp.c
SRC += s_lib_ver.c
SRC += s_log1p.c
diff -aprNU5 djgpp.orig/src/libm/math/s_frexp.c djgpp/src/libm/math/s_frexp.c
--- djgpp.orig/src/libm/math/s_frexp.c 1998-02-07 13:47:34 +0000
+++ djgpp/src/libm/math/s_frexp.c 2017-12-30 16:26:10 +0000
@@ -11,20 +11,23 @@
* ====================================================
*/
/*
FUNCTION
- <<frexp>>, <<frexpf>>---split floating-point number
+ <<frexp>>, <<frexpf>>, <<frexpl>>---split floating-point number
INDEX
frexp
INDEX
frexpf
+INDEX
+ frexpl
ANSI_SYNOPSIS
#include <math.h>
double frexp(double <[val]>, int *<[exp]>);
float frexpf(float <[val]>, int *<[exp]>);
+ long double frexpl(long double <[val]>, int *<[exp]>);
TRAD_SYNOPSIS
#include <math.h>
double frexp(<[val]>, <[exp]>)
double <[val]>;
@@ -32,10 +35,14 @@ TRAD_SYNOPSIS
float frexpf(<[val]>, <[exp]>)
float <[val]>;
int *<[exp]>;
+ long double frexpl(<[val]>, <[exp]>)
+ long double <[val]>;
+ int *<[exp]>;
+
DESCRIPTION
All non zero, normal numbers can be described as <[m]> * 2**<[p]>.
<<frexp>> represents the double <[val]> as a mantissa <[m]>
and a power of two <[p]>. The resulting mantissa will always
@@ -53,10 +60,13 @@ $ val = m \times 2^p $.
@end tex
<<frexpf>> is identical, other than taking and returning
floats rather than doubles.
+<<frexpl>> is identical, other than taking and returning
+long doubles rather than doubles.
+
RETURNS
<<frexp>> returns the mantissa <[m]>. If <[val]> is <<0>>, infinity,
or Nan, <<frexp>> will set <<*>><[exp]> to <<0>> and return <[val]>.
PORTABILITY
diff -aprNU5 djgpp.orig/src/libm/math/s_frexpl.c djgpp/src/libm/math/s_frexpl.c
--- djgpp.orig/src/libm/math/s_frexpl.c 1970-01-01 00:00:00 +0000
+++ djgpp/src/libm/math/s_frexpl.c 2017-12-30 18:18:56 +0000
@@ -0,0 +1,71 @@
+/* s_frexpl.c -- long double version of s_frexp.c.
+ * Conversion to 80-bit long double by Juan Manuel Guerrero, juan DOT guerrero AT gmx DOT de.
+ */
+
+
+/* @(#)s_frexp.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+
+/*
+ * for non-zero x
+ * x = frexp(arg,&exp);
+ * return a long double fp quantity x such that 0.5 <= |x| <1.0
+ * and the corresponding binary exponent "exp". That is
+ * arg = x*2^exp.
+ * If arg is inf, 0.0, or NaN, then frexp(arg,&exp) returns arg
+ * with *exp=0.
+ */
+
+#define IS_INF_OR_NAN(v) ((v).ldt.exponent == 0x7FFF)
+#define IS_DENORMAL(v) ((v).ldt.exponent == 0x0000 && (((v).ldt.mantissah & 0x80000000) == 0x00000000))
+#define IS_PSEUDO_DENORMAL(v) ((v).ldt.exponent == 0x0000 && (((v).ldt.mantissah & 0x80000000) == 0x80000000))
+#define IS_ZERO(v) (((v).ldt.mantissah | (v).ldt.mantissal) == 0x00000000)
+
+#include <libc/ieee.h>
+#include "fdlibm.h"
+
+#ifdef __STDC__
+static const long double
+#else
+static long double
+#endif
+two65 = 3.6893488147419103232E+19; /* 0, 0x3FFF + 0x0041, 0x80000000U, 0x00000000U */
+#ifdef __STDC__
+static const long double
+#else
+static long double
+#endif
+two64 = 1.8446744073709551616E+19; /* 0, 0x3FFF + 0x0040, 0x80000000U, 0x00000000U */
+#ifdef __STDC__
+ long double frexpl(long double x, int *eptr)
+#else
+ long double frexpl(x, eptr)
+ long double x; int *eptr;
+#endif
+{
+ _longdouble_union_t value;
+ value.ld = x;
+ *eptr = 0;
+ if (IS_INF_OR_NAN(value) || IS_ZERO(value)) return x; /* 0,inf,nan */
+ if (IS_DENORMAL(value)) { /* subnormal */
+ value.ld *= two65;
+ *eptr = -65;
+ }
+ else if (IS_PSEUDO_DENORMAL(value)) { /* pseudo subnormal */
+ value.ld *= two64;
+ *eptr = -64;
+ }
+ *eptr += value.ldt.exponent - 16382;
+ value.ldt.exponent = 16382;
+ return value.ld;
+}
diff -aprNU5 djgpp.orig/tests/cygnus/frexpl-t.c djgpp/tests/cygnus/frexpl-t.c
--- djgpp.orig/tests/cygnus/frexpl-t.c 1970-01-01 00:00:00 +0000
+++ djgpp/tests/cygnus/frexpl-t.c 2017-12-30 21:47:52 +0000
@@ -0,0 +1,284 @@
+/* Copyright (C) 2017 DJ Delorie, see COPYING.DJ for details */
+
+
+#include "main-t.h"
+
+typedef struct {
+ const _longdouble_union_t value; /* test value */
+ const _longdouble_union_t mantissa; /* result */
+ const int exponent; /* result */
+} entry_t;
+
+static const entry_t tests_long_double[] =
+{
+ /* test value */
+ /* value mantissa exponent */
+
+ /* Zeros. */
+ {{.ldt = {0x0U, 0x0U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x00000000U, 0x0000U, 0}}, 0}, /* 0.0 */
+ {{.ldt = {0x0U, 0x0U, 0x0U, 1}}, {.ldt = {0x00000000U, 0x00000000U, 0x0000U, 1}}, 0}, /* -0.0 */
+
+ /* Subnormals aka denormals. */
+ {{.ldt = {0x00000001U, 0x0U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16444}, /* Very small number. */
+ {{.ldt = {0x00000008U, 0x0U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16441}, /* Very small number. */
+ {{.ldt = {0x00000080U, 0x0U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16437}, /* Very small number. */
+ {{.ldt = {0x00000800U, 0x0U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16433}, /* Very small number. */
+ {{.ldt = {0x00008000U, 0x0U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16429}, /* Very small number. */
+ {{.ldt = {0x00080000U, 0x0U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16425}, /* Very small number. */
+ {{.ldt = {0x00800000U, 0x0U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16421}, /* Very small number. */
+ {{.ldt = {0x08000000U, 0x0U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16417}, /* Very small number. */
+ {{.ldt = {0x80000000U, 0x0U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16413}, /* Very small number. */
+ {{.ldt = {0x0U, 0x00000008U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16409}, /* Very small number. */
+ {{.ldt = {0x0U, 0x00000080U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16405}, /* Very small number. */
+ {{.ldt = {0x0U, 0x00000800U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16401}, /* Very small number. */
+ {{.ldt = {0x0U, 0x00008000U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16397}, /* Very small number. */
+ {{.ldt = {0x0U, 0x00080000U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16393}, /* Very small number. */
+ {{.ldt = {0x0U, 0x00800000U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16389}, /* Very small number. */
+ {{.ldt = {0x0U, 0x08000000U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16385}, /* Very small number. */
+ {{.ldt = {0x0U, 0x40000000U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16382}, /* Very small number. */
+
+ {{.ldt = {0x00000001U, 0x0U, 0x0U, 1}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 1}}, -16444}, /* Very small number. */
+ {{.ldt = {0x00000007U, 0x0U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16442}, /* Very small number. */
+ {{.ldt = {0x00000070U, 0x0U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16438}, /* Very small number. */
+ {{.ldt = {0x00000700U, 0x0U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16434}, /* Very small number. */
+ {{.ldt = {0x00007000U, 0x0U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16430}, /* Very small number. */
+ {{.ldt = {0x00070000U, 0x0U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16426}, /* Very small number. */
+ {{.ldt = {0x00700000U, 0x0U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16422}, /* Very small number. */
+ {{.ldt = {0x07000000U, 0x0U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16418}, /* Very small number. */
+ {{.ldt = {0x70000000U, 0x0U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16414}, /* Very small number. */
+ {{.ldt = {0x0U, 0x00000007U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16410}, /* Very small number. */
+ {{.ldt = {0x0U, 0x00000070U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16406}, /* Very small number. */
+ {{.ldt = {0x0U, 0x00000700U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16402}, /* Very small number. */
+ {{.ldt = {0x0U, 0x00007000U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16398}, /* Very small number. */
+ {{.ldt = {0x0U, 0x00070000U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16394}, /* Very small number. */
+ {{.ldt = {0x0U, 0x00700000U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16390}, /* Very small number. */
+ {{.ldt = {0x0U, 0x07000000U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16386}, /* Very small number. */
+ {{.ldt = {0x0U, 0x70000000U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16382}, /* Very small number. */
+
+ /* Pseudo denormals. */
+ {{.ldt = {0x00000001U, 0x80000000U, 0x0U, 0}}, {.ldt = {0x00000001U, 0x80000000U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000008U, 0x80000000U, 0x0U, 0}}, {.ldt = {0x00000008U, 0x80000000U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000080U, 0x80000000U, 0x0U, 0}}, {.ldt = {0x00000080U, 0x80000000U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000800U, 0x80000000U, 0x0U, 0}}, {.ldt = {0x00000800U, 0x80000000U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00008000U, 0x80000000U, 0x0U, 0}}, {.ldt = {0x00008000U, 0x80000000U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00080000U, 0x80000000U, 0x0U, 0}}, {.ldt = {0x00080000U, 0x80000000U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00800000U, 0x80000000U, 0x0U, 0}}, {.ldt = {0x00800000U, 0x80000000U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x08000000U, 0x80000000U, 0x0U, 0}}, {.ldt = {0x08000000U, 0x80000000U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x80000000U, 0x80000000U, 0x0U, 0}}, {.ldt = {0x80000000U, 0x80000000U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0x80000008U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000008U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0x80000080U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000080U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0x80000800U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000800U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0x80008000U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80008000U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0x80080000U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80080000U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0x80800000U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80800000U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0x88000000U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x88000000U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0xC0000000U, 0x0U, 0}}, {.ldt = {0x00000000U, 0xC0000000U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+
+ {{.ldt = {0x00000001U, 0x80000000U, 0x0U, 1}}, {.ldt = {0x00000001U, 0x80000000U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000007U, 0x80000000U, 0x0U, 1}}, {.ldt = {0x00000007U, 0x80000000U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000070U, 0x80000000U, 0x0U, 1}}, {.ldt = {0x00000070U, 0x80000000U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000700U, 0x80000000U, 0x0U, 1}}, {.ldt = {0x00000700U, 0x80000000U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00007000U, 0x80000000U, 0x0U, 1}}, {.ldt = {0x00007000U, 0x80000000U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00070000U, 0x80000000U, 0x0U, 1}}, {.ldt = {0x00070000U, 0x80000000U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00700000U, 0x80000000U, 0x0U, 1}}, {.ldt = {0x00700000U, 0x80000000U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x07000000U, 0x80000000U, 0x0U, 1}}, {.ldt = {0x07000000U, 0x80000000U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x70000000U, 0x80000000U, 0x0U, 1}}, {.ldt = {0x70000000U, 0x80000000U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0x80000007U, 0x0U, 1}}, {.ldt = {0x00000000U, 0x80000007U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0x80000070U, 0x0U, 1}}, {.ldt = {0x00000000U, 0x80000070U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0x80000700U, 0x0U, 1}}, {.ldt = {0x00000000U, 0x80000700U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0x80007000U, 0x0U, 1}}, {.ldt = {0x00000000U, 0x80007000U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0x80070000U, 0x0U, 1}}, {.ldt = {0x00000000U, 0x80070000U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0x80700000U, 0x0U, 1}}, {.ldt = {0x00000000U, 0x80700000U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0x87000000U, 0x0U, 1}}, {.ldt = {0x00000000U, 0x87000000U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0xF0000000U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xF0000000U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+
+ /* Normals. */
+ {{.ldt = {0x0U, 0x80000000U, 0x1U, 0}}, {.ldt = {00000000U, 0X80000000U, 0X3FFEU, 0}}, -16381}, /* Small number. */
+ {{.ldt = {0x0U, 0x80000000U, 0x1U, 1}}, {.ldt = {00000000U, 0X80000000U, 0X3FFEU, 1}}, -16381}, /* Small -number. */
+ {{.ldt = {0xFFFFFFFFU, 0xFFFFFFFFU, 0x7FFEU, 0}}, {.ldt = {0XFFFFFFFFU, 0XFFFFFFFFU, 0X3FFEU, 0}}, 16384}, /* Big number. */
+ {{.ldt = {0xFFFFFFFFU, 0xFFFFFFFFU, 0x7FFEU, 1}}, {.ldt = {0XFFFFFFFFU, 0XFFFFFFFFU, 0X3FFEU, 1}}, 16384}, /* Big -number. */
+
+ /* Infs. */
+ {{.ldt = {0x0U, 0x80000000U, 0x7FFFU, 0}}, {.ldt = {0x0U, 0x80000000U, 0x7FFFU, 0}}, 0}, /* Inf */
+ {{.ldt = {0x0U, 0x80000000U, 0x7FFFU, 1}}, {.ldt = {0x0U, 0x80000000U, 0x7FFFU, 1}}, 0}, /* -Inf */
+
+ /* NaNs. */
+ {{.ldt = {0x1U, 0x80000000U, 0x7FFFU, 0}}, {.ldt = {0x1U, 0x80000000U, 0x7FFFU, 0}}, 0}, /* SNaN */
+ {{.ldt = {0x1U, 0x80000000U, 0x7FFFU, 1}}, {.ldt = {0x1U, 0x80000000U, 0x7FFFU, 1}}, 0}, /* -SNaN */
+ {{.ldt = {0x0U, 0xFFFFFFFFU, 0x7FFFU, 0}}, {.ldt = {0x0U, 0xFFFFFFFFU, 0x7FFFU, 0}}, 0}, /* QNaN */
+ {{.ldt = {0x0U, 0xFFFFFFFFU, 0x7FFFU, 1}}, {.ldt = {0x0U, 0xFFFFFFFFU, 0x7FFFU, 1}}, 0}, /* -QNaN */
+
+ /* Number. */
+ {{.ldt = {0x2168C000U, 0xC90FDAA2U, 0x3FFFU + 0x0001U, 0}}, {.ldt = {0x2168C000U, 0xC90FDAA2U, 0x3FFEU, 0}}, 2}, /* PI */
+ {{.ldt = {0x2168C000U, 0xC90FDAA2U, 0x3FFFU + 0x0001U, 1}}, {.ldt = {0x2168C000U, 0xC90FDAA2U, 0x3FFEU, 1}}, 2}, /* -PI */
+
+
+ {{.ldt = {0x00000000U, 0xF0000000U, 0x3FFFU + 0x0U, 0}}, {.ldt = {0x00000000U, 0xF0000000U, 0x3FFEU, 0}}, 1}, /* 1.875000 */
+ {{.ldt = {0x00000000U, 0xF0000000U, 0x3FFFU + 0x0U, 1}}, {.ldt = {0x00000000U, 0xF0000000U, 0x3FFEU, 1}}, 1}, /* -1.875000 */
+ {{.ldt = {0x00000000U, 0xD0000000U, 0x3FFFU + 0x0U, 0}}, {.ldt = {0x00000000U, 0xD0000000U, 0x3FFEU, 0}}, 1}, /* 1.625000 */
+ {{.ldt = {0x00000000U, 0xD0000000U, 0x3FFFU + 0x0U, 1}}, {.ldt = {0x00000000U, 0xD0000000U, 0x3FFEU, 1}}, 1}, /* -1.625000 */
+ {{.ldt = {0xF7A0B800U, 0xC00010C6U, 0x3FFFU + 0x0U, 0}}, {.ldt = {0xF7A0B800U, 0xC00010C6U, 0x3FFEU, 0}}, 1}, /* 1.500002 */
+ {{.ldt = {0xF7A0B800U, 0xC00010C6U, 0x3FFFU + 0x0U, 1}}, {.ldt = {0xF7A0B800U, 0xC00010C6U, 0x3FFEU, 1}}, 1}, /* -1.500002 */
+ {{.ldt = {0x00000000U, 0xC0000000U, 0x3FFFU + 0x0U, 0}}, {.ldt = {0x00000000U, 0xC0000000U, 0x3FFEU, 0}}, 1}, /* 1.500000 */
+ {{.ldt = {0x00000000U, 0xC0000000U, 0x3FFFU + 0x0U, 1}}, {.ldt = {0x00000000U, 0xC0000000U, 0x3FFEU, 1}}, 1}, /* -1.500000 */
+ {{.ldt = {0x085F4800U, 0xBFFFEF39U, 0x3FFFU + 0x0U, 0}}, {.ldt = {0x085F4800U, 0xBFFFEF39U, 0x3FFEU, 0}}, 1}, /* 1.499998 */
+ {{.ldt = {0x085F4800U, 0xBFFFEF39U, 0x3FFFU + 0x0U, 1}}, {.ldt = {0x085F4800U, 0xBFFFEF39U, 0x3FFEU, 1}}, 1}, /* -1.499998 */
+ {{.ldt = {0x00000000U, 0xB0000000U, 0x3FFFU + 0x0U, 0}}, {.ldt = {0x00000000U, 0xB0000000U, 0x3FFEU, 0}}, 1}, /* 1.375000 */
+ {{.ldt = {0x00000000U, 0xB0000000U, 0x3FFFU + 0x0U, 1}}, {.ldt = {0x00000000U, 0xB0000000U, 0x3FFEU, 1}}, 1}, /* -1.375000 */
+ {{.ldt = {0x00000000U, 0x90000000U, 0x3FFFU + 0x0U, 0}}, {.ldt = {0x00000000U, 0x90000000U, 0x3FFEU, 0}}, 1}, /* 1.125000 */
+ {{.ldt = {0x00000000U, 0x90000000U, 0x3FFFU + 0x0U, 1}}, {.ldt = {0x00000000U, 0x90000000U, 0x3FFEU, 1}}, 1}, /* -1.125000 */
+
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x0016U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, 23}, /* 4194304.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x0016U, 1}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 1}}, 23}, /* -4194304.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x0017U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, 24}, /* 8388608.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x0017U, 1}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 1}}, 24}, /* -8388608.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x0018U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, 25}, /* 16777216.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x0018U, 1}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 1}}, 25}, /* -16777216.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x001EU, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, 31}, /* 1073741824.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x001EU, 1}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 1}}, 31}, /* -1073741824.000000 */
+ {{.ldt = {0x00000000U, 0xFFFFFFFEU, 0x3FFFU + 0x001EU, 0}}, {.ldt = {0x00000000U, 0xFFFFFFFEU, 0x3FFEU, 0}}, 31}, /* 2147483647.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x001FU, 1}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 1}}, 32}, /* -2147483648.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x0020U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, 33}, /* 4294967296.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x0020U, 1}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 1}}, 33}, /* -4294967296.000000 */
+
+ {{.ldt = {0x89A00000U, 0x81234567U, 0x3FFFU + 0x0033U, 0}}, {.ldt = {0x89A00000U, 0x81234567U, 0x3FFEU, 0}}, 52}, /* 2271815812028928.000000 */
+ {{.ldt = {0x89A00000U, 0x81234567U, 0x3FFFU + 0x0033U, 1}}, {.ldt = {0x89A00000U, 0x81234567U, 0x3FFEU, 1}}, 52}, /* -2271815812028928.000000 */
+ {{.ldt = {0xC4D58000U, 0x8091A2B3U, 0x3FFFU + 0x0034U, 0}}, {.ldt = {0xC4D58000U, 0x8091A2B3U, 0x3FFEU, 0}}, 53}, /* 4523615625714352.000000 */
+ {{.ldt = {0xC4D58000U, 0x8091A2B3U, 0x3FFFU + 0x0034U, 1}}, {.ldt = {0xC4D58000U, 0x8091A2B3U, 0x3FFEU, 1}}, 53}, /* -4523615625714352.000000 */
+ {{.ldt = {0x3B2A1800U, 0xFF6E5D4CU, 0x3FFFU + 0x0034U, 0}}, {.ldt = {0x3B2A1800U, 0xFF6E5D4CU, 0x3FFEU, 0}}, 53}, /* 8987183256397123.000000 */
+ {{.ldt = {0x3B2A1800U, 0xFF6E5D4CU, 0x3FFFU + 0x0034U, 1}}, {.ldt = {0x3B2A1800U, 0xFF6E5D4CU, 0x3FFEU, 1}}, 53}, /* -8987183256397123.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x0035U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, 54}, /* 9007199254740992.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x0035U, 1}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 1}}, 54}, /* -9007199254740992.000000 */
+
+ {{.ldt = {0x4D5E7000U, 0x891A2B3CU, 0x3FFFU + 0x0035U, 0}}, {.ldt = {0x4D5E7000U, 0x891A2B3CU, 0x3FFEU, 0}}, 54}, /* 9647711201744796.000000 */
+ {{.ldt = {0x4D5E7000U, 0x891A2B3CU, 0x3FFFU + 0x0035U, 1}}, {.ldt = {0x4D5E7000U, 0x891A2B3CU, 0x3FFEU, 1}}, 54}, /* -9647711201744796.000000 */
+ {{.ldt = {0x76543000U, 0xFEDCBA98U, 0x3FFFU + 0x0041U, 0}}, {.ldt = {0x76543000U, 0xFEDCBA98U, 0x3FFEU, 0}}, 66}, /* 73459034177972256768.000000 */
+ {{.ldt = {0x76543000U, 0xFEDCBA98U, 0x3FFFU + 0x0041U, 1}}, {.ldt = {0x76543000U, 0xFEDCBA98U, 0x3FFEU, 1}}, 66}, /* -73459034177972256768.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x003FU, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, 64}, /* 9223372036854775808.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x003FU, 1}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 1}}, 64}, /* -9223372036854775808.000000 */
+ {{.ldt = {0x00000000U, 0xC0000000U, 0x3FFFU + 0x003FU, 0}}, {.ldt = {0x00000000U, 0xC0000000U, 0x3FFEU, 0}}, 64}, /* 13835058055282163712.000000 */
+ {{.ldt = {0x00000000U, 0xC0000000U, 0x3FFFU + 0x003FU, 1}}, {.ldt = {0x00000000U, 0xC0000000U, 0x3FFEU, 1}}, 64}, /* -13835058055282163712.000000 */
+ {{.ldt = {0x00000000U, 0xF0000000U, 0x3FFFU + 0x0042U, 0}}, {.ldt = {0x00000000U, 0xF0000000U, 0x3FFEU, 0}}, 67}, /* 138350580552821637120.000000 */
+ {{.ldt = {0x00000000U, 0xF0000000U, 0x3FFFU + 0x0042U, 1}}, {.ldt = {0x00000000U, 0xF0000000U, 0x3FFEU, 1}}, 67}, /* -138350580552821637120.000000 */
+ {{.ldt = {0xBA987800U, 0xF7FFFEDCU, 0x3FFFU + 0x0042U, 0}}, {.ldt = {0xBA987800U, 0xF7FFFEDCU, 0x3FFEU, 0}}, 67}, /* 142962256563249856512.000000 */
+ {{.ldt = {0xBA987800U, 0xF7FFFEDCU, 0x3FFFU + 0x0042U, 1}}, {.ldt = {0xBA987800U, 0xF7FFFEDCU, 0x3FFEU, 1}}, 67}, /* -142962256563249856512.000000 */
+ {{.ldt = {0x00000000U, 0xF8000000U, 0x3FFFU + 0x0042U, 0}}, {.ldt = {0x00000000U, 0xF8000000U, 0x3FFEU, 0}}, 67}, /* 142962266571249025024.000000 */
+ {{.ldt = {0x00000000U, 0xF8000000U, 0x3FFFU + 0x0042U, 1}}, {.ldt = {0x00000000U, 0xF8000000U, 0x3FFEU, 1}}, 67}, /* -142962266571249025024.000000 */
+ {{.ldt = {0x00012000U, 0xF8000000U, 0x3FFFU + 0x0042U, 0}}, {.ldt = {0x00012000U, 0xF8000000U, 0x3FFEU, 0}}, 67}, /* 142962266571249614848.000000 */
+ {{.ldt = {0x00012000U, 0xF8000000U, 0x3FFFU + 0x0042U, 1}}, {.ldt = {0x00012000U, 0xF8000000U, 0x3FFEU, 1}}, 67}, /* -142962266571249614848.000000 */
+ {{.ldt = {0x76543000U, 0xFEDCBA98U, 0x3FFFU + 0x0042U, 0}}, {.ldt = {0x76543000U, 0xFEDCBA98U, 0x3FFEU, 0}}, 67}, /* 146918068355944513536.000000 */
+ {{.ldt = {0x76543000U, 0xFEDCBA98U, 0x3FFFU + 0x0042U, 1}}, {.ldt = {0x76543000U, 0xFEDCBA98U, 0x3FFEU, 1}}, 67}, /* 147573952589676396544.000000 */
+ {{.ldt = {0xFFFFF800U, 0xFFFFFFFFU, 0x3FFFU + 0x0042U, 0}}, {.ldt = {0xFFFFF800U, 0xFFFFFFFFU, 0x3FFEU, 0}}, 67}, /* -147573952589676396544.000000 */
+ {{.ldt = {0xFFFFF800U, 0xFFFFFFFFU, 0x3FFFU + 0x0042U, 1}}, {.ldt = {0xFFFFF800U, 0xFFFFFFFFU, 0x3FFEU, 1}}, 67}, /* -147573952589676396544.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x0040U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, 65}, /* 18446744073709551616.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x0040U, 1}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 1}}, 65}, /* -18446744073709551616.000000 */
+
+ /* Number. */
+ {{.ldt = {0x80000F0CU, 0xFFFFFFFFU, 0x3FFFU + 0x001FU, 0}}, {.ldt = {0x80000F0CU, 0xFFFFFFFFU, 0x3FFEU, 0}}, 32}, /* 4294967295.500001 */
+ {{.ldt = {0x8FFFFF00U, 0xFFFFFFFEU, 0x3FFFU + 0x001FU, 0}}, {.ldt = {0x8FFFFF00U, 0xFFFFFFFEU, 0x3FFEU, 0}}, 32}, /* 4294967294.562500 */
+ {{.ldt = {0x8000AA00U, 0xFFFFFFFEU, 0x3FFFU + 0x001FU, 0}}, {.ldt = {0x8000AA00U, 0xFFFFFFFEU, 0x3FFEU, 0}}, 32}, /* 4294967294.500010 */
+ {{.ldt = {0x707CD001U, 0xFFFFFFFEU, 0x3FFFU + 0x001FU, 0}}, {.ldt = {0x707CD001U, 0xFFFFFFFEU, 0x3FFEU, 0}}, 32}, /* 4294967294.439404 */
+ {{.ldt = {0x7FFEB00DU, 0xFFFFFFFEU, 0x3FFFU + 0x001FU, 0}}, {.ldt = {0x7FFEB00DU, 0xFFFFFFFEU, 0x3FFEU, 0}}, 32}, /* 4294967294.499980 */
+ {{.ldt = {0x90123007U, 0xFFFFFFFFU, 0x3FFFU + 0x001FU, 0}}, {.ldt = {0x90123007U, 0xFFFFFFFFU, 0x3FFEU, 0}}, 32}, /* 4294967295.562778 */
+
+ {{.ldt = {0x0000FFFFU, 0xFFFFFFFFU, 0x3FFFU + 0x003EU, 0}}, {.ldt = {0x0000FFFFU, 0xFFFFFFFFU, 0x3FFEU, 0}}, 63}, /* 9223372034707324927.500000 */
+ {{.ldt = {0x7777777FU, 0xFFFFFFFEU, 0x3FFFU + 0x003EU, 0}}, {.ldt = {0x7777777FU, 0xFFFFFFFEU, 0x3FFEU, 0}}, 63}, /* 9223372033561967551.500000 */
+ {{.ldt = {0x9EEEEEE0U, 0xFFFFFFFEU, 0x3FFFU + 0x003EU, 0}}, {.ldt = {0x9EEEEEE0U, 0xFFFFFFFEU, 0x3FFEU, 0}}, 63}, /* 9223372033893037936.000000 */
+ {{.ldt = {0xEEEEEE07U, 0xFFFFFFFEU, 0x3FFFU + 0x003EU, 0}}, {.ldt = {0xEEEEEE07U, 0xFFFFFFFEU, 0x3FFEU, 0}}, 63}, /* 9223372034564126467.500000 */
+ {{.ldt = {0xEEEEEE0EU, 0xFFFFFFFEU, 0x3FFFU + 0x003EU, 0}}, {.ldt = {0xEEEEEE0EU, 0xFFFFFFFEU, 0x3FFEU, 0}}, 63}, /* 9223372034564126471.000000 */
+ {{.ldt = {0xFFFFFF0FU, 0xFFFFFFFFU, 0x3FFFU + 0x003EU, 0}}, {.ldt = {0xFFFFFF0FU, 0xFFFFFFFFU, 0x3FFEU, 0}}, 63}, /* 9223372036854775687.500000 */
+
+ {{.ldt = {0xAAAAAAAAU, 0xAAAAAAAAU, 0x3FFFU + 0x1AABU, 0}}, {.ldt = {0xAAAAAAAAU, 0xAAAAAAAAU, 0x3FFEU, 0}}, 6828}, /* 1.806005774585392e+2055 */
+ {{.ldt = {0xCCCCCCCCU, 0xCCCCCCCCU, 0x3FFFU + 0x2CCDU, 0}}, {.ldt = {0xCCCCCCCCU, 0xCCCCCCCCU, 0x3FFEU, 0}}, 11470}, /* 5.213630550621597e+3452 */
+ {{.ldt = {0xEEEEEEEEU, 0xEEEEEEEEU, 0x3FFFU + 0x3EEFU, 0}}, {.ldt = {0xEEEEEEEEU, 0xEEEEEEEEU, 0x3FFEU, 0}}, 16112} /* 1.463278241057685e+4850 */
+};
+
+static const size_t n_tests_long_double = sizeof(tests_long_double) / sizeof(tests_long_double[0]);
+
+#undef IS_EQUAL
+#define IS_EQUAL(a, b) (((a).ldt.sign == (b).ldt.sign) && ((a).ldt.exponent == (b).ldt.exponent) && ((a).ldt.mantissah == (b).ldt.mantissah) && ((a).ldt.mantissal == (b).ldt.mantissal))
+
+
+int frexpl_test(void)
+{
+ unsigned int i, counter;
+ int exponent, result;
+
+ for (counter = i = 0; i < n_tests_long_double; i++)
+ {
+ _longdouble_union_t mantissa;
+ mantissa.ld = frexpl(tests_long_double[i].value.ld, &exponent);
+
+ if (IS_EQUAL(tests_long_double[i].mantissa, mantissa) && tests_long_double[i].exponent == exponent)
+ counter++;
+ else
+ printf("frexpl test failed: value to frexpl = %.12Lf\nmantissa result = %.12Lf exponent result = %d\nmantissa should be = %.12Lf exponent should be = %d\n", tests_long_double[i].value.ld, mantissa.ld, exponent, tests_long_double[i].mantissa.ld, tests_long_double[i].exponent);
+ }
+
+ {
+ volatile long double mantissa, x;
+ result = 0;
+ /* Test on finite numbers that fails on AIX 5.1. */
+ x = 16.0L;
+ {
+ exponent = -9999;
+ frexpl (x, &exponent);
+ if (exponent != 5)
+ result |= 1;
+ }
+ /* Test on finite numbers that fails on Mac OS X 10.4, because its frexpl
+ function returns an invalid (incorrectly normalized) value: it returns
+ y = { 0x3fe028f5, 0xc28f5c28, 0x3c9eb851, 0xeb851eb8 }
+ but the correct result is
+ 0.505L = { 0x3fe028f5, 0xc28f5c29, 0xbc547ae1, 0x47ae1480 } */
+ x = 1.01L;
+ {
+ exponent = -9999;
+ mantissa = frexpl (x, &exponent);
+ if (!(exponent == 1 && mantissa == 0.505L))
+ result |= 2;
+ }
+ /* Test on large finite numbers. This fails on BeOS at i = 16322, while
+ LDBL_MAX_EXP = 16384.
+ In the loop end test, we test x against Infinity, rather than comparing
+ i with LDBL_MAX_EXP, because BeOS <float.h> has a wrong LDBL_MAX_EXP. */
+ {
+ for (i = 1, x = 1.0L; x != x + x; i++, x *= 2.0L)
+ {
+ exponent = -9999;
+ frexpl (x, &exponent);
+ if (exponent != i)
+ {
+ result |= 4;
+ break;
+ }
+ }
+ }
+ /* Test on denormalized numbers. */
+ {
+ int i;
+ for (i = 1, x = 1.0L; i >= LDBL_MIN_EXP; i--, x *= 0.5L)
+ ;
+ if (x > 0.0L)
+ {
+ mantissa = frexpl (x, &exponent);
+ /* On machines with IEEE854 arithmetic: x = 1.68105e-4932,
+ exp = -16382, y = 0.5. On Mac OS X 10.5: exp = -16384, y = 0.5. */
+ if (exponent != LDBL_MIN_EXP - 1)
+ result |= 8;
+ }
+ }
+ /* Test on infinite numbers. */
+ x = 1.0L / 0.0L;
+ {
+ mantissa = frexpl (x, &exponent);
+ if (mantissa != x)
+ result |= 16;
+ }
+ }
+
+ result = counter < n_tests_long_double || result ? 1 : 0;
+ printf("%s\n", result ? "frexpl test failed." : "frexpl test succeded.");
+
+ return result;
+}
diff -aprNU5 djgpp.orig/tests/cygnus/main-t.c djgpp/tests/cygnus/main-t.c
--- djgpp.orig/tests/cygnus/main-t.c 2013-11-16 21:48:40 +0000
+++ djgpp/tests/cygnus/main-t.c 2017-12-30 16:26:10 +0000
@@ -1,5 +1,6 @@
+/* Copyright (C) 2017 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 2013 DJ Delorie, see COPYING.DJ for details */
#include <unistd.h>
#include "main-t.h"
@@ -48,10 +49,12 @@ int main(void)
failed += isspecialf_test(); number_of_functions++;
printf("Testing isinf, isnan and finite...\n");
failed += isspecial_test(); number_of_functions++;
printf("Testing isinfl, isnanl and finitel...\n");
failed += isspeciall_test(); number_of_functions++;
+ printf("Testing frexpl...\n");
+ failed += frexpl_test(); number_of_functions++;
printf("Tested %d functions, %d errors detected\n", number_of_functions, failed);
if (!isatty(fileno(stdout)))
fprintf(stderr, "Tested %d functions, %d errors detected\n", number_of_functions, failed);
diff -aprNU5 djgpp.orig/tests/cygnus/main-t.h djgpp/tests/cygnus/main-t.h
--- djgpp.orig/tests/cygnus/main-t.h 2013-11-16 21:52:22 +0000
+++ djgpp/tests/cygnus/main-t.h 2017-12-30 16:39:54 +0000
@@ -1,12 +1,14 @@
+/* Copyright (C) 2017 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 2013 DJ Delorie, see COPYING.DJ for details */
#ifndef MAIN_T_H
# define MAIN_T_H
# include <stdio.h>
+# include <float.h>
# include <math.h>
# include <libc/ieee.h>
int llrint_test(void);
@@ -28,7 +30,8 @@ int truncf_test(void);
int truncl_test(void);
int rintl_test(void);
int isspecialf_test(void);
int isspecial_test(void);
int isspeciall_test(void);
+int frexpl_test(void);
#endif /* MAIN_T_H */
diff -aprNU5 djgpp.orig/tests/cygnus/makefile djgpp/tests/cygnus/makefile
--- djgpp.orig/tests/cygnus/makefile 2013-11-16 21:48:42 +0000
+++ djgpp/tests/cygnus/makefile 2017-12-30 16:26:10 +0000
@@ -41,11 +41,11 @@ OFILES = test.o string.o convert.o conv_
dvec.o sprint_vec.o sprint_ivec.o math.o math2.o test_ieee.o
T_OFILES = main-t.o trunc-t.o truncf-t.o truncl-t.o lrint-t.o lrintf-t.o \
lrintl-t.o llrint-t.o llrintl-t.o roundf-t.o round-t.o roundl-t.o \
lroundf-t.o lround-t.o lroundl-t.o llroundf-t.o llround-t.o llroundl-t.o \
- rintl-t.o isspecial-t.o
+ rintl-t.o isspecial-t.o frexpl-t.o
acosVEC_FILES = acos_vec.c acosf_vec.c
acoshVEC_FILES = acosh_vec.c acoshf_vec.c
asinVEC_FILES = asin_vec.c asinf_vec.c
asinhVEC_FILES = asinh_vec.c asinhf_vec.c
--------------010603080109010204050001
Content-Type: text/x-patch;
name="frexpl.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="frexpl.patch"
diff -aprNU5 djgpp.orig/include/libm/math.h djgpp/include/libm/math.h
--- djgpp.orig/include/libm/math.h 2015-07-19 11:28:00 +0000
+++ djgpp/include/libm/math.h 2017-12-30 16:26:10 +0000
@@ -1,5 +1,6 @@
+/* Copyright (C) 2017 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 2015 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 2013 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 1998 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
/* Provided by Cygnus Support (jtc AT cygnus DOT com) */
@@ -154,10 +155,12 @@ extern double sqrt __P((double));
extern double ceil __P((double));
extern double fabs __P((double));
extern double floor __P((double));
extern double fmod __P((double, double));
+extern long double frexpl __P((long double, int *));
+
#if !defined(__STRICT_ANSI__) || defined(__cplusplus) || \
defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
/* ISO C99 types and macros. */
extern long long int llrintf __P((float));
diff -aprNU5 djgpp.orig/include/math.h djgpp/include/math.h
--- djgpp.orig/include/math.h 2015-07-18 17:07:40 +0000
+++ djgpp/include/math.h 2017-12-30 16:26:10 +0000
@@ -1,5 +1,6 @@
+/* Copyright (C) 2017 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 2015 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 2013 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 2003 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 1999 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 1998 DJ Delorie, see COPYING.DJ for details */
@@ -83,10 +84,12 @@ extern float sqrtf(float);
extern float ceilf(float);
extern float fabsf(float);
extern float floorf(float);
extern float fmodf(float, float);
+extern long double frexpl(long double, int *);
+
/* End libm.a. */
#endif
#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) \
diff -aprNU5 djgpp.orig/src/libm/math/makefile djgpp/src/libm/math/makefile
--- djgpp.orig/src/libm/math/makefile 2015-07-18 17:07:52 +0000
+++ djgpp/src/libm/math/makefile 2017-12-30 16:26:10 +0000
@@ -1,5 +1,6 @@
+# Copyright (C) 2017 DJ Delorie, see COPYING.DJ for details
# Copyright (C) 2013 DJ Delorie, see COPYING.DJ for details
# Copyright (C) 1998 DJ Delorie, see COPYING.DJ for details
TOP=..
SRC += k_standard.c
@@ -66,10 +67,11 @@ SRC += s_erf.c
SRC += s_expm1.c
SRC += s_fabs.c
SRC += s_finite.c
SRC += s_floor.c
SRC += s_frexp.c
+SRC += s_frexpl.c
SRC += s_ilogb.c
SRC += s_isnan.c
SRC += s_ldexp.c
SRC += s_lib_ver.c
SRC += s_log1p.c
diff -aprNU5 djgpp.orig/src/libm/math/s_frexp.c djgpp/src/libm/math/s_frexp.c
--- djgpp.orig/src/libm/math/s_frexp.c 1998-02-07 13:47:34 +0000
+++ djgpp/src/libm/math/s_frexp.c 2017-12-30 16:26:10 +0000
@@ -11,20 +11,23 @@
* ====================================================
*/
/*
FUNCTION
- <<frexp>>, <<frexpf>>---split floating-point number
+ <<frexp>>, <<frexpf>>, <<frexpl>>---split floating-point number
INDEX
frexp
INDEX
frexpf
+INDEX
+ frexpl
ANSI_SYNOPSIS
#include <math.h>
double frexp(double <[val]>, int *<[exp]>);
float frexpf(float <[val]>, int *<[exp]>);
+ long double frexpl(long double <[val]>, int *<[exp]>);
TRAD_SYNOPSIS
#include <math.h>
double frexp(<[val]>, <[exp]>)
double <[val]>;
@@ -32,10 +35,14 @@ TRAD_SYNOPSIS
float frexpf(<[val]>, <[exp]>)
float <[val]>;
int *<[exp]>;
+ long double frexpl(<[val]>, <[exp]>)
+ long double <[val]>;
+ int *<[exp]>;
+
DESCRIPTION
All non zero, normal numbers can be described as <[m]> * 2**<[p]>.
<<frexp>> represents the double <[val]> as a mantissa <[m]>
and a power of two <[p]>. The resulting mantissa will always
@@ -53,10 +60,13 @@ $ val = m \times 2^p $.
@end tex
<<frexpf>> is identical, other than taking and returning
floats rather than doubles.
+<<frexpl>> is identical, other than taking and returning
+long doubles rather than doubles.
+
RETURNS
<<frexp>> returns the mantissa <[m]>. If <[val]> is <<0>>, infinity,
or Nan, <<frexp>> will set <<*>><[exp]> to <<0>> and return <[val]>.
PORTABILITY
diff -aprNU5 djgpp.orig/src/libm/math/s_frexpl.c djgpp/src/libm/math/s_frexpl.c
--- djgpp.orig/src/libm/math/s_frexpl.c 1970-01-01 00:00:00 +0000
+++ djgpp/src/libm/math/s_frexpl.c 2017-12-30 18:18:56 +0000
@@ -0,0 +1,71 @@
+/* s_frexpl.c -- long double version of s_frexp.c.
+ * Conversion to 80-bit long double by Juan Manuel Guerrero, juan DOT guerrero AT gmx DOT de.
+ */
+
+
+/* @(#)s_frexp.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+
+/*
+ * for non-zero x
+ * x = frexp(arg,&exp);
+ * return a long double fp quantity x such that 0.5 <= |x| <1.0
+ * and the corresponding binary exponent "exp". That is
+ * arg = x*2^exp.
+ * If arg is inf, 0.0, or NaN, then frexp(arg,&exp) returns arg
+ * with *exp=0.
+ */
+
+#define IS_INF_OR_NAN(v) ((v).ldt.exponent == 0x7FFF)
+#define IS_DENORMAL(v) ((v).ldt.exponent == 0x0000 && (((v).ldt.mantissah & 0x80000000) == 0x00000000))
+#define IS_PSEUDO_DENORMAL(v) ((v).ldt.exponent == 0x0000 && (((v).ldt.mantissah & 0x80000000) == 0x80000000))
+#define IS_ZERO(v) (((v).ldt.mantissah | (v).ldt.mantissal) == 0x00000000)
+
+#include <libc/ieee.h>
+#include "fdlibm.h"
+
+#ifdef __STDC__
+static const long double
+#else
+static long double
+#endif
+two65 = 3.6893488147419103232E+19; /* 0, 0x3FFF + 0x0041, 0x80000000U, 0x00000000U */
+#ifdef __STDC__
+static const long double
+#else
+static long double
+#endif
+two64 = 1.8446744073709551616E+19; /* 0, 0x3FFF + 0x0040, 0x80000000U, 0x00000000U */
+#ifdef __STDC__
+ long double frexpl(long double x, int *eptr)
+#else
+ long double frexpl(x, eptr)
+ long double x; int *eptr;
+#endif
+{
+ _longdouble_union_t value;
+ value.ld = x;
+ *eptr = 0;
+ if (IS_INF_OR_NAN(value) || IS_ZERO(value)) return x; /* 0,inf,nan */
+ if (IS_DENORMAL(value)) { /* subnormal */
+ value.ld *= two65;
+ *eptr = -65;
+ }
+ else if (IS_PSEUDO_DENORMAL(value)) { /* pseudo subnormal */
+ value.ld *= two64;
+ *eptr = -64;
+ }
+ *eptr += value.ldt.exponent - 16382;
+ value.ldt.exponent = 16382;
+ return value.ld;
+}
diff -aprNU5 djgpp.orig/tests/cygnus/frexpl-t.c djgpp/tests/cygnus/frexpl-t.c
--- djgpp.orig/tests/cygnus/frexpl-t.c 1970-01-01 00:00:00 +0000
+++ djgpp/tests/cygnus/frexpl-t.c 2017-12-30 21:47:52 +0000
@@ -0,0 +1,284 @@
+/* Copyright (C) 2017 DJ Delorie, see COPYING.DJ for details */
+
+
+#include "main-t.h"
+
+typedef struct {
+ const _longdouble_union_t value; /* test value */
+ const _longdouble_union_t mantissa; /* result */
+ const int exponent; /* result */
+} entry_t;
+
+static const entry_t tests_long_double[] =
+{
+ /* test value */
+ /* value mantissa exponent */
+
+ /* Zeros. */
+ {{.ldt = {0x0U, 0x0U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x00000000U, 0x0000U, 0}}, 0}, /* 0.0 */
+ {{.ldt = {0x0U, 0x0U, 0x0U, 1}}, {.ldt = {0x00000000U, 0x00000000U, 0x0000U, 1}}, 0}, /* -0.0 */
+
+ /* Subnormals aka denormals. */
+ {{.ldt = {0x00000001U, 0x0U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16444}, /* Very small number. */
+ {{.ldt = {0x00000008U, 0x0U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16441}, /* Very small number. */
+ {{.ldt = {0x00000080U, 0x0U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16437}, /* Very small number. */
+ {{.ldt = {0x00000800U, 0x0U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16433}, /* Very small number. */
+ {{.ldt = {0x00008000U, 0x0U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16429}, /* Very small number. */
+ {{.ldt = {0x00080000U, 0x0U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16425}, /* Very small number. */
+ {{.ldt = {0x00800000U, 0x0U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16421}, /* Very small number. */
+ {{.ldt = {0x08000000U, 0x0U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16417}, /* Very small number. */
+ {{.ldt = {0x80000000U, 0x0U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16413}, /* Very small number. */
+ {{.ldt = {0x0U, 0x00000008U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16409}, /* Very small number. */
+ {{.ldt = {0x0U, 0x00000080U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16405}, /* Very small number. */
+ {{.ldt = {0x0U, 0x00000800U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16401}, /* Very small number. */
+ {{.ldt = {0x0U, 0x00008000U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16397}, /* Very small number. */
+ {{.ldt = {0x0U, 0x00080000U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16393}, /* Very small number. */
+ {{.ldt = {0x0U, 0x00800000U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16389}, /* Very small number. */
+ {{.ldt = {0x0U, 0x08000000U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16385}, /* Very small number. */
+ {{.ldt = {0x0U, 0x40000000U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, -16382}, /* Very small number. */
+
+ {{.ldt = {0x00000001U, 0x0U, 0x0U, 1}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 1}}, -16444}, /* Very small number. */
+ {{.ldt = {0x00000007U, 0x0U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16442}, /* Very small number. */
+ {{.ldt = {0x00000070U, 0x0U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16438}, /* Very small number. */
+ {{.ldt = {0x00000700U, 0x0U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16434}, /* Very small number. */
+ {{.ldt = {0x00007000U, 0x0U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16430}, /* Very small number. */
+ {{.ldt = {0x00070000U, 0x0U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16426}, /* Very small number. */
+ {{.ldt = {0x00700000U, 0x0U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16422}, /* Very small number. */
+ {{.ldt = {0x07000000U, 0x0U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16418}, /* Very small number. */
+ {{.ldt = {0x70000000U, 0x0U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16414}, /* Very small number. */
+ {{.ldt = {0x0U, 0x00000007U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16410}, /* Very small number. */
+ {{.ldt = {0x0U, 0x00000070U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16406}, /* Very small number. */
+ {{.ldt = {0x0U, 0x00000700U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16402}, /* Very small number. */
+ {{.ldt = {0x0U, 0x00007000U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16398}, /* Very small number. */
+ {{.ldt = {0x0U, 0x00070000U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16394}, /* Very small number. */
+ {{.ldt = {0x0U, 0x00700000U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16390}, /* Very small number. */
+ {{.ldt = {0x0U, 0x07000000U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16386}, /* Very small number. */
+ {{.ldt = {0x0U, 0x70000000U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xE0000000U, 0x3FFEU, 1}}, -16382}, /* Very small number. */
+
+ /* Pseudo denormals. */
+ {{.ldt = {0x00000001U, 0x80000000U, 0x0U, 0}}, {.ldt = {0x00000001U, 0x80000000U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000008U, 0x80000000U, 0x0U, 0}}, {.ldt = {0x00000008U, 0x80000000U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000080U, 0x80000000U, 0x0U, 0}}, {.ldt = {0x00000080U, 0x80000000U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000800U, 0x80000000U, 0x0U, 0}}, {.ldt = {0x00000800U, 0x80000000U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00008000U, 0x80000000U, 0x0U, 0}}, {.ldt = {0x00008000U, 0x80000000U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00080000U, 0x80000000U, 0x0U, 0}}, {.ldt = {0x00080000U, 0x80000000U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00800000U, 0x80000000U, 0x0U, 0}}, {.ldt = {0x00800000U, 0x80000000U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x08000000U, 0x80000000U, 0x0U, 0}}, {.ldt = {0x08000000U, 0x80000000U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x80000000U, 0x80000000U, 0x0U, 0}}, {.ldt = {0x80000000U, 0x80000000U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0x80000008U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000008U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0x80000080U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000080U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0x80000800U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80000800U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0x80008000U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80008000U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0x80080000U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80080000U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0x80800000U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x80800000U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0x88000000U, 0x0U, 0}}, {.ldt = {0x00000000U, 0x88000000U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0xC0000000U, 0x0U, 0}}, {.ldt = {0x00000000U, 0xC0000000U, 0x3FFEU, 0}}, -16381}, /* Very small number. */
+
+ {{.ldt = {0x00000001U, 0x80000000U, 0x0U, 1}}, {.ldt = {0x00000001U, 0x80000000U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000007U, 0x80000000U, 0x0U, 1}}, {.ldt = {0x00000007U, 0x80000000U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000070U, 0x80000000U, 0x0U, 1}}, {.ldt = {0x00000070U, 0x80000000U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000700U, 0x80000000U, 0x0U, 1}}, {.ldt = {0x00000700U, 0x80000000U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00007000U, 0x80000000U, 0x0U, 1}}, {.ldt = {0x00007000U, 0x80000000U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00070000U, 0x80000000U, 0x0U, 1}}, {.ldt = {0x00070000U, 0x80000000U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00700000U, 0x80000000U, 0x0U, 1}}, {.ldt = {0x00700000U, 0x80000000U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x07000000U, 0x80000000U, 0x0U, 1}}, {.ldt = {0x07000000U, 0x80000000U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x70000000U, 0x80000000U, 0x0U, 1}}, {.ldt = {0x70000000U, 0x80000000U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0x80000007U, 0x0U, 1}}, {.ldt = {0x00000000U, 0x80000007U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0x80000070U, 0x0U, 1}}, {.ldt = {0x00000000U, 0x80000070U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0x80000700U, 0x0U, 1}}, {.ldt = {0x00000000U, 0x80000700U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0x80007000U, 0x0U, 1}}, {.ldt = {0x00000000U, 0x80007000U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0x80070000U, 0x0U, 1}}, {.ldt = {0x00000000U, 0x80070000U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0x80700000U, 0x0U, 1}}, {.ldt = {0x00000000U, 0x80700000U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0x87000000U, 0x0U, 1}}, {.ldt = {0x00000000U, 0x87000000U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+ {{.ldt = {0x00000000U, 0xF0000000U, 0x0U, 1}}, {.ldt = {0x00000000U, 0xF0000000U, 0x3FFEU, 1}}, -16381}, /* Very small number. */
+
+ /* Normals. */
+ {{.ldt = {0x0U, 0x80000000U, 0x1U, 0}}, {.ldt = {00000000U, 0X80000000U, 0X3FFEU, 0}}, -16381}, /* Small number. */
+ {{.ldt = {0x0U, 0x80000000U, 0x1U, 1}}, {.ldt = {00000000U, 0X80000000U, 0X3FFEU, 1}}, -16381}, /* Small -number. */
+ {{.ldt = {0xFFFFFFFFU, 0xFFFFFFFFU, 0x7FFEU, 0}}, {.ldt = {0XFFFFFFFFU, 0XFFFFFFFFU, 0X3FFEU, 0}}, 16384}, /* Big number. */
+ {{.ldt = {0xFFFFFFFFU, 0xFFFFFFFFU, 0x7FFEU, 1}}, {.ldt = {0XFFFFFFFFU, 0XFFFFFFFFU, 0X3FFEU, 1}}, 16384}, /* Big -number. */
+
+ /* Infs. */
+ {{.ldt = {0x0U, 0x80000000U, 0x7FFFU, 0}}, {.ldt = {0x0U, 0x80000000U, 0x7FFFU, 0}}, 0}, /* Inf */
+ {{.ldt = {0x0U, 0x80000000U, 0x7FFFU, 1}}, {.ldt = {0x0U, 0x80000000U, 0x7FFFU, 1}}, 0}, /* -Inf */
+
+ /* NaNs. */
+ {{.ldt = {0x1U, 0x80000000U, 0x7FFFU, 0}}, {.ldt = {0x1U, 0x80000000U, 0x7FFFU, 0}}, 0}, /* SNaN */
+ {{.ldt = {0x1U, 0x80000000U, 0x7FFFU, 1}}, {.ldt = {0x1U, 0x80000000U, 0x7FFFU, 1}}, 0}, /* -SNaN */
+ {{.ldt = {0x0U, 0xFFFFFFFFU, 0x7FFFU, 0}}, {.ldt = {0x0U, 0xFFFFFFFFU, 0x7FFFU, 0}}, 0}, /* QNaN */
+ {{.ldt = {0x0U, 0xFFFFFFFFU, 0x7FFFU, 1}}, {.ldt = {0x0U, 0xFFFFFFFFU, 0x7FFFU, 1}}, 0}, /* -QNaN */
+
+ /* Number. */
+ {{.ldt = {0x2168C000U, 0xC90FDAA2U, 0x3FFFU + 0x0001U, 0}}, {.ldt = {0x2168C000U, 0xC90FDAA2U, 0x3FFEU, 0}}, 2}, /* PI */
+ {{.ldt = {0x2168C000U, 0xC90FDAA2U, 0x3FFFU + 0x0001U, 1}}, {.ldt = {0x2168C000U, 0xC90FDAA2U, 0x3FFEU, 1}}, 2}, /* -PI */
+
+
+ {{.ldt = {0x00000000U, 0xF0000000U, 0x3FFFU + 0x0U, 0}}, {.ldt = {0x00000000U, 0xF0000000U, 0x3FFEU, 0}}, 1}, /* 1.875000 */
+ {{.ldt = {0x00000000U, 0xF0000000U, 0x3FFFU + 0x0U, 1}}, {.ldt = {0x00000000U, 0xF0000000U, 0x3FFEU, 1}}, 1}, /* -1.875000 */
+ {{.ldt = {0x00000000U, 0xD0000000U, 0x3FFFU + 0x0U, 0}}, {.ldt = {0x00000000U, 0xD0000000U, 0x3FFEU, 0}}, 1}, /* 1.625000 */
+ {{.ldt = {0x00000000U, 0xD0000000U, 0x3FFFU + 0x0U, 1}}, {.ldt = {0x00000000U, 0xD0000000U, 0x3FFEU, 1}}, 1}, /* -1.625000 */
+ {{.ldt = {0xF7A0B800U, 0xC00010C6U, 0x3FFFU + 0x0U, 0}}, {.ldt = {0xF7A0B800U, 0xC00010C6U, 0x3FFEU, 0}}, 1}, /* 1.500002 */
+ {{.ldt = {0xF7A0B800U, 0xC00010C6U, 0x3FFFU + 0x0U, 1}}, {.ldt = {0xF7A0B800U, 0xC00010C6U, 0x3FFEU, 1}}, 1}, /* -1.500002 */
+ {{.ldt = {0x00000000U, 0xC0000000U, 0x3FFFU + 0x0U, 0}}, {.ldt = {0x00000000U, 0xC0000000U, 0x3FFEU, 0}}, 1}, /* 1.500000 */
+ {{.ldt = {0x00000000U, 0xC0000000U, 0x3FFFU + 0x0U, 1}}, {.ldt = {0x00000000U, 0xC0000000U, 0x3FFEU, 1}}, 1}, /* -1.500000 */
+ {{.ldt = {0x085F4800U, 0xBFFFEF39U, 0x3FFFU + 0x0U, 0}}, {.ldt = {0x085F4800U, 0xBFFFEF39U, 0x3FFEU, 0}}, 1}, /* 1.499998 */
+ {{.ldt = {0x085F4800U, 0xBFFFEF39U, 0x3FFFU + 0x0U, 1}}, {.ldt = {0x085F4800U, 0xBFFFEF39U, 0x3FFEU, 1}}, 1}, /* -1.499998 */
+ {{.ldt = {0x00000000U, 0xB0000000U, 0x3FFFU + 0x0U, 0}}, {.ldt = {0x00000000U, 0xB0000000U, 0x3FFEU, 0}}, 1}, /* 1.375000 */
+ {{.ldt = {0x00000000U, 0xB0000000U, 0x3FFFU + 0x0U, 1}}, {.ldt = {0x00000000U, 0xB0000000U, 0x3FFEU, 1}}, 1}, /* -1.375000 */
+ {{.ldt = {0x00000000U, 0x90000000U, 0x3FFFU + 0x0U, 0}}, {.ldt = {0x00000000U, 0x90000000U, 0x3FFEU, 0}}, 1}, /* 1.125000 */
+ {{.ldt = {0x00000000U, 0x90000000U, 0x3FFFU + 0x0U, 1}}, {.ldt = {0x00000000U, 0x90000000U, 0x3FFEU, 1}}, 1}, /* -1.125000 */
+
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x0016U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, 23}, /* 4194304.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x0016U, 1}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 1}}, 23}, /* -4194304.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x0017U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, 24}, /* 8388608.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x0017U, 1}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 1}}, 24}, /* -8388608.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x0018U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, 25}, /* 16777216.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x0018U, 1}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 1}}, 25}, /* -16777216.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x001EU, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, 31}, /* 1073741824.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x001EU, 1}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 1}}, 31}, /* -1073741824.000000 */
+ {{.ldt = {0x00000000U, 0xFFFFFFFEU, 0x3FFFU + 0x001EU, 0}}, {.ldt = {0x00000000U, 0xFFFFFFFEU, 0x3FFEU, 0}}, 31}, /* 2147483647.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x001FU, 1}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 1}}, 32}, /* -2147483648.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x0020U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, 33}, /* 4294967296.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x0020U, 1}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 1}}, 33}, /* -4294967296.000000 */
+
+ {{.ldt = {0x89A00000U, 0x81234567U, 0x3FFFU + 0x0033U, 0}}, {.ldt = {0x89A00000U, 0x81234567U, 0x3FFEU, 0}}, 52}, /* 2271815812028928.000000 */
+ {{.ldt = {0x89A00000U, 0x81234567U, 0x3FFFU + 0x0033U, 1}}, {.ldt = {0x89A00000U, 0x81234567U, 0x3FFEU, 1}}, 52}, /* -2271815812028928.000000 */
+ {{.ldt = {0xC4D58000U, 0x8091A2B3U, 0x3FFFU + 0x0034U, 0}}, {.ldt = {0xC4D58000U, 0x8091A2B3U, 0x3FFEU, 0}}, 53}, /* 4523615625714352.000000 */
+ {{.ldt = {0xC4D58000U, 0x8091A2B3U, 0x3FFFU + 0x0034U, 1}}, {.ldt = {0xC4D58000U, 0x8091A2B3U, 0x3FFEU, 1}}, 53}, /* -4523615625714352.000000 */
+ {{.ldt = {0x3B2A1800U, 0xFF6E5D4CU, 0x3FFFU + 0x0034U, 0}}, {.ldt = {0x3B2A1800U, 0xFF6E5D4CU, 0x3FFEU, 0}}, 53}, /* 8987183256397123.000000 */
+ {{.ldt = {0x3B2A1800U, 0xFF6E5D4CU, 0x3FFFU + 0x0034U, 1}}, {.ldt = {0x3B2A1800U, 0xFF6E5D4CU, 0x3FFEU, 1}}, 53}, /* -8987183256397123.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x0035U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, 54}, /* 9007199254740992.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x0035U, 1}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 1}}, 54}, /* -9007199254740992.000000 */
+
+ {{.ldt = {0x4D5E7000U, 0x891A2B3CU, 0x3FFFU + 0x0035U, 0}}, {.ldt = {0x4D5E7000U, 0x891A2B3CU, 0x3FFEU, 0}}, 54}, /* 9647711201744796.000000 */
+ {{.ldt = {0x4D5E7000U, 0x891A2B3CU, 0x3FFFU + 0x0035U, 1}}, {.ldt = {0x4D5E7000U, 0x891A2B3CU, 0x3FFEU, 1}}, 54}, /* -9647711201744796.000000 */
+ {{.ldt = {0x76543000U, 0xFEDCBA98U, 0x3FFFU + 0x0041U, 0}}, {.ldt = {0x76543000U, 0xFEDCBA98U, 0x3FFEU, 0}}, 66}, /* 73459034177972256768.000000 */
+ {{.ldt = {0x76543000U, 0xFEDCBA98U, 0x3FFFU + 0x0041U, 1}}, {.ldt = {0x76543000U, 0xFEDCBA98U, 0x3FFEU, 1}}, 66}, /* -73459034177972256768.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x003FU, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, 64}, /* 9223372036854775808.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x003FU, 1}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 1}}, 64}, /* -9223372036854775808.000000 */
+ {{.ldt = {0x00000000U, 0xC0000000U, 0x3FFFU + 0x003FU, 0}}, {.ldt = {0x00000000U, 0xC0000000U, 0x3FFEU, 0}}, 64}, /* 13835058055282163712.000000 */
+ {{.ldt = {0x00000000U, 0xC0000000U, 0x3FFFU + 0x003FU, 1}}, {.ldt = {0x00000000U, 0xC0000000U, 0x3FFEU, 1}}, 64}, /* -13835058055282163712.000000 */
+ {{.ldt = {0x00000000U, 0xF0000000U, 0x3FFFU + 0x0042U, 0}}, {.ldt = {0x00000000U, 0xF0000000U, 0x3FFEU, 0}}, 67}, /* 138350580552821637120.000000 */
+ {{.ldt = {0x00000000U, 0xF0000000U, 0x3FFFU + 0x0042U, 1}}, {.ldt = {0x00000000U, 0xF0000000U, 0x3FFEU, 1}}, 67}, /* -138350580552821637120.000000 */
+ {{.ldt = {0xBA987800U, 0xF7FFFEDCU, 0x3FFFU + 0x0042U, 0}}, {.ldt = {0xBA987800U, 0xF7FFFEDCU, 0x3FFEU, 0}}, 67}, /* 142962256563249856512.000000 */
+ {{.ldt = {0xBA987800U, 0xF7FFFEDCU, 0x3FFFU + 0x0042U, 1}}, {.ldt = {0xBA987800U, 0xF7FFFEDCU, 0x3FFEU, 1}}, 67}, /* -142962256563249856512.000000 */
+ {{.ldt = {0x00000000U, 0xF8000000U, 0x3FFFU + 0x0042U, 0}}, {.ldt = {0x00000000U, 0xF8000000U, 0x3FFEU, 0}}, 67}, /* 142962266571249025024.000000 */
+ {{.ldt = {0x00000000U, 0xF8000000U, 0x3FFFU + 0x0042U, 1}}, {.ldt = {0x00000000U, 0xF8000000U, 0x3FFEU, 1}}, 67}, /* -142962266571249025024.000000 */
+ {{.ldt = {0x00012000U, 0xF8000000U, 0x3FFFU + 0x0042U, 0}}, {.ldt = {0x00012000U, 0xF8000000U, 0x3FFEU, 0}}, 67}, /* 142962266571249614848.000000 */
+ {{.ldt = {0x00012000U, 0xF8000000U, 0x3FFFU + 0x0042U, 1}}, {.ldt = {0x00012000U, 0xF8000000U, 0x3FFEU, 1}}, 67}, /* -142962266571249614848.000000 */
+ {{.ldt = {0x76543000U, 0xFEDCBA98U, 0x3FFFU + 0x0042U, 0}}, {.ldt = {0x76543000U, 0xFEDCBA98U, 0x3FFEU, 0}}, 67}, /* 146918068355944513536.000000 */
+ {{.ldt = {0x76543000U, 0xFEDCBA98U, 0x3FFFU + 0x0042U, 1}}, {.ldt = {0x76543000U, 0xFEDCBA98U, 0x3FFEU, 1}}, 67}, /* 147573952589676396544.000000 */
+ {{.ldt = {0xFFFFF800U, 0xFFFFFFFFU, 0x3FFFU + 0x0042U, 0}}, {.ldt = {0xFFFFF800U, 0xFFFFFFFFU, 0x3FFEU, 0}}, 67}, /* -147573952589676396544.000000 */
+ {{.ldt = {0xFFFFF800U, 0xFFFFFFFFU, 0x3FFFU + 0x0042U, 1}}, {.ldt = {0xFFFFF800U, 0xFFFFFFFFU, 0x3FFEU, 1}}, 67}, /* -147573952589676396544.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x0040U, 0}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 0}}, 65}, /* 18446744073709551616.000000 */
+ {{.ldt = {0x00000000U, 0x80000000U, 0x3FFFU + 0x0040U, 1}}, {.ldt = {0x00000000U, 0x80000000U, 0x3FFEU, 1}}, 65}, /* -18446744073709551616.000000 */
+
+ /* Number. */
+ {{.ldt = {0x80000F0CU, 0xFFFFFFFFU, 0x3FFFU + 0x001FU, 0}}, {.ldt = {0x80000F0CU, 0xFFFFFFFFU, 0x3FFEU, 0}}, 32}, /* 4294967295.500001 */
+ {{.ldt = {0x8FFFFF00U, 0xFFFFFFFEU, 0x3FFFU + 0x001FU, 0}}, {.ldt = {0x8FFFFF00U, 0xFFFFFFFEU, 0x3FFEU, 0}}, 32}, /* 4294967294.562500 */
+ {{.ldt = {0x8000AA00U, 0xFFFFFFFEU, 0x3FFFU + 0x001FU, 0}}, {.ldt = {0x8000AA00U, 0xFFFFFFFEU, 0x3FFEU, 0}}, 32}, /* 4294967294.500010 */
+ {{.ldt = {0x707CD001U, 0xFFFFFFFEU, 0x3FFFU + 0x001FU, 0}}, {.ldt = {0x707CD001U, 0xFFFFFFFEU, 0x3FFEU, 0}}, 32}, /* 4294967294.439404 */
+ {{.ldt = {0x7FFEB00DU, 0xFFFFFFFEU, 0x3FFFU + 0x001FU, 0}}, {.ldt = {0x7FFEB00DU, 0xFFFFFFFEU, 0x3FFEU, 0}}, 32}, /* 4294967294.499980 */
+ {{.ldt = {0x90123007U, 0xFFFFFFFFU, 0x3FFFU + 0x001FU, 0}}, {.ldt = {0x90123007U, 0xFFFFFFFFU, 0x3FFEU, 0}}, 32}, /* 4294967295.562778 */
+
+ {{.ldt = {0x0000FFFFU, 0xFFFFFFFFU, 0x3FFFU + 0x003EU, 0}}, {.ldt = {0x0000FFFFU, 0xFFFFFFFFU, 0x3FFEU, 0}}, 63}, /* 9223372034707324927.500000 */
+ {{.ldt = {0x7777777FU, 0xFFFFFFFEU, 0x3FFFU + 0x003EU, 0}}, {.ldt = {0x7777777FU, 0xFFFFFFFEU, 0x3FFEU, 0}}, 63}, /* 9223372033561967551.500000 */
+ {{.ldt = {0x9EEEEEE0U, 0xFFFFFFFEU, 0x3FFFU + 0x003EU, 0}}, {.ldt = {0x9EEEEEE0U, 0xFFFFFFFEU, 0x3FFEU, 0}}, 63}, /* 9223372033893037936.000000 */
+ {{.ldt = {0xEEEEEE07U, 0xFFFFFFFEU, 0x3FFFU + 0x003EU, 0}}, {.ldt = {0xEEEEEE07U, 0xFFFFFFFEU, 0x3FFEU, 0}}, 63}, /* 9223372034564126467.500000 */
+ {{.ldt = {0xEEEEEE0EU, 0xFFFFFFFEU, 0x3FFFU + 0x003EU, 0}}, {.ldt = {0xEEEEEE0EU, 0xFFFFFFFEU, 0x3FFEU, 0}}, 63}, /* 9223372034564126471.000000 */
+ {{.ldt = {0xFFFFFF0FU, 0xFFFFFFFFU, 0x3FFFU + 0x003EU, 0}}, {.ldt = {0xFFFFFF0FU, 0xFFFFFFFFU, 0x3FFEU, 0}}, 63}, /* 9223372036854775687.500000 */
+
+ {{.ldt = {0xAAAAAAAAU, 0xAAAAAAAAU, 0x3FFFU + 0x1AABU, 0}}, {.ldt = {0xAAAAAAAAU, 0xAAAAAAAAU, 0x3FFEU, 0}}, 6828}, /* 1.806005774585392e+2055 */
+ {{.ldt = {0xCCCCCCCCU, 0xCCCCCCCCU, 0x3FFFU + 0x2CCDU, 0}}, {.ldt = {0xCCCCCCCCU, 0xCCCCCCCCU, 0x3FFEU, 0}}, 11470}, /* 5.213630550621597e+3452 */
+ {{.ldt = {0xEEEEEEEEU, 0xEEEEEEEEU, 0x3FFFU + 0x3EEFU, 0}}, {.ldt = {0xEEEEEEEEU, 0xEEEEEEEEU, 0x3FFEU, 0}}, 16112} /* 1.463278241057685e+4850 */
+};
+
+static const size_t n_tests_long_double = sizeof(tests_long_double) / sizeof(tests_long_double[0]);
+
+#undef IS_EQUAL
+#define IS_EQUAL(a, b) (((a).ldt.sign == (b).ldt.sign) && ((a).ldt.exponent == (b).ldt.exponent) && ((a).ldt.mantissah == (b).ldt.mantissah) && ((a).ldt.mantissal == (b).ldt.mantissal))
+
+
+int frexpl_test(void)
+{
+ unsigned int i, counter;
+ int exponent, result;
+
+ for (counter = i = 0; i < n_tests_long_double; i++)
+ {
+ _longdouble_union_t mantissa;
+ mantissa.ld = frexpl(tests_long_double[i].value.ld, &exponent);
+
+ if (IS_EQUAL(tests_long_double[i].mantissa, mantissa) && tests_long_double[i].exponent == exponent)
+ counter++;
+ else
+ printf("frexpl test failed: value to frexpl = %.12Lf\nmantissa result = %.12Lf exponent result = %d\nmantissa should be = %.12Lf exponent should be = %d\n", tests_long_double[i].value.ld, mantissa.ld, exponent, tests_long_double[i].mantissa.ld, tests_long_double[i].exponent);
+ }
+
+ {
+ volatile long double mantissa, x;
+ result = 0;
+ /* Test on finite numbers that fails on AIX 5.1. */
+ x = 16.0L;
+ {
+ exponent = -9999;
+ frexpl (x, &exponent);
+ if (exponent != 5)
+ result |= 1;
+ }
+ /* Test on finite numbers that fails on Mac OS X 10.4, because its frexpl
+ function returns an invalid (incorrectly normalized) value: it returns
+ y = { 0x3fe028f5, 0xc28f5c28, 0x3c9eb851, 0xeb851eb8 }
+ but the correct result is
+ 0.505L = { 0x3fe028f5, 0xc28f5c29, 0xbc547ae1, 0x47ae1480 } */
+ x = 1.01L;
+ {
+ exponent = -9999;
+ mantissa = frexpl (x, &exponent);
+ if (!(exponent == 1 && mantissa == 0.505L))
+ result |= 2;
+ }
+ /* Test on large finite numbers. This fails on BeOS at i = 16322, while
+ LDBL_MAX_EXP = 16384.
+ In the loop end test, we test x against Infinity, rather than comparing
+ i with LDBL_MAX_EXP, because BeOS <float.h> has a wrong LDBL_MAX_EXP. */
+ {
+ for (i = 1, x = 1.0L; x != x + x; i++, x *= 2.0L)
+ {
+ exponent = -9999;
+ frexpl (x, &exponent);
+ if (exponent != i)
+ {
+ result |= 4;
+ break;
+ }
+ }
+ }
+ /* Test on denormalized numbers. */
+ {
+ int i;
+ for (i = 1, x = 1.0L; i >= LDBL_MIN_EXP; i--, x *= 0.5L)
+ ;
+ if (x > 0.0L)
+ {
+ mantissa = frexpl (x, &exponent);
+ /* On machines with IEEE854 arithmetic: x = 1.68105e-4932,
+ exp = -16382, y = 0.5. On Mac OS X 10.5: exp = -16384, y = 0.5. */
+ if (exponent != LDBL_MIN_EXP - 1)
+ result |= 8;
+ }
+ }
+ /* Test on infinite numbers. */
+ x = 1.0L / 0.0L;
+ {
+ mantissa = frexpl (x, &exponent);
+ if (mantissa != x)
+ result |= 16;
+ }
+ }
+
+ result = counter < n_tests_long_double || result ? 1 : 0;
+ printf("%s\n", result ? "frexpl test failed." : "frexpl test succeded.");
+
+ return result;
+}
diff -aprNU5 djgpp.orig/tests/cygnus/main-t.c djgpp/tests/cygnus/main-t.c
--- djgpp.orig/tests/cygnus/main-t.c 2013-11-16 21:48:40 +0000
+++ djgpp/tests/cygnus/main-t.c 2017-12-30 16:26:10 +0000
@@ -1,5 +1,6 @@
+/* Copyright (C) 2017 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 2013 DJ Delorie, see COPYING.DJ for details */
#include <unistd.h>
#include "main-t.h"
@@ -48,10 +49,12 @@ int main(void)
failed += isspecialf_test(); number_of_functions++;
printf("Testing isinf, isnan and finite...\n");
failed += isspecial_test(); number_of_functions++;
printf("Testing isinfl, isnanl and finitel...\n");
failed += isspeciall_test(); number_of_functions++;
+ printf("Testing frexpl...\n");
+ failed += frexpl_test(); number_of_functions++;
printf("Tested %d functions, %d errors detected\n", number_of_functions, failed);
if (!isatty(fileno(stdout)))
fprintf(stderr, "Tested %d functions, %d errors detected\n", number_of_functions, failed);
diff -aprNU5 djgpp.orig/tests/cygnus/main-t.h djgpp/tests/cygnus/main-t.h
--- djgpp.orig/tests/cygnus/main-t.h 2013-11-16 21:52:22 +0000
+++ djgpp/tests/cygnus/main-t.h 2017-12-30 16:39:54 +0000
@@ -1,12 +1,14 @@
+/* Copyright (C) 2017 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 2013 DJ Delorie, see COPYING.DJ for details */
#ifndef MAIN_T_H
# define MAIN_T_H
# include <stdio.h>
+# include <float.h>
# include <math.h>
# include <libc/ieee.h>
int llrint_test(void);
@@ -28,7 +30,8 @@ int truncf_test(void);
int truncl_test(void);
int rintl_test(void);
int isspecialf_test(void);
int isspecial_test(void);
int isspeciall_test(void);
+int frexpl_test(void);
#endif /* MAIN_T_H */
diff -aprNU5 djgpp.orig/tests/cygnus/makefile djgpp/tests/cygnus/makefile
--- djgpp.orig/tests/cygnus/makefile 2013-11-16 21:48:42 +0000
+++ djgpp/tests/cygnus/makefile 2017-12-30 16:26:10 +0000
@@ -41,11 +41,11 @@ OFILES = test.o string.o convert.o conv_
dvec.o sprint_vec.o sprint_ivec.o math.o math2.o test_ieee.o
T_OFILES = main-t.o trunc-t.o truncf-t.o truncl-t.o lrint-t.o lrintf-t.o \
lrintl-t.o llrint-t.o llrintl-t.o roundf-t.o round-t.o roundl-t.o \
lroundf-t.o lround-t.o lroundl-t.o llroundf-t.o llround-t.o llroundl-t.o \
- rintl-t.o isspecial-t.o
+ rintl-t.o isspecial-t.o frexpl-t.o
acosVEC_FILES = acos_vec.c acosf_vec.c
acoshVEC_FILES = acosh_vec.c acoshf_vec.c
asinVEC_FILES = asin_vec.c asinf_vec.c
asinhVEC_FILES = asinh_vec.c asinhf_vec.c
--------------010603080109010204050001--
- Raw text -