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]" 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. Content-Type: multipart/mixed; boundary="------------010603080109010204050001" 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 - <>, <>---split floating-point number + <>, <>, <>---split floating-point number INDEX frexp INDEX frexpf +INDEX + frexpl ANSI_SYNOPSIS #include double frexp(double <[val]>, int *<[exp]>); float frexpf(float <[val]>, int *<[exp]>); + long double frexpl(long double <[val]>, int *<[exp]>); TRAD_SYNOPSIS #include 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]>. <> 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 <> is identical, other than taking and returning floats rather than doubles. +<> is identical, other than taking and returning +long doubles rather than doubles. + RETURNS <> returns the mantissa <[m]>. If <[val]> is <<0>>, infinity, or Nan, <> 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 +#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 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 #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 +# include # include # include 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 - <>, <>---split floating-point number + <>, <>, <>---split floating-point number INDEX frexp INDEX frexpf +INDEX + frexpl ANSI_SYNOPSIS #include double frexp(double <[val]>, int *<[exp]>); float frexpf(float <[val]>, int *<[exp]>); + long double frexpl(long double <[val]>, int *<[exp]>); TRAD_SYNOPSIS #include 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]>. <> 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 <> is identical, other than taking and returning floats rather than doubles. +<> is identical, other than taking and returning +long doubles rather than doubles. + RETURNS <> returns the mantissa <[m]>. If <[val]> is <<0>>, infinity, or Nan, <> 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 +#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 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 #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 +# include # include # include 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--