www.delorie.com/archives/browse.cgi   search  
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 -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019