Blame math/test-misc.c

Packit 6c4009
/* Miscellaneous tests which don't fit anywhere else.
Packit 6c4009
   Copyright (C) 2000-2018 Free Software Foundation, Inc.
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
Packit 6c4009
   The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
   modify it under the terms of the GNU Lesser General Public
Packit 6c4009
   License as published by the Free Software Foundation; either
Packit 6c4009
   version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
   The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
   Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
   You should have received a copy of the GNU Lesser General Public
Packit 6c4009
   License along with the GNU C Library; if not, see
Packit 6c4009
   <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
#include <fenv.h>
Packit 6c4009
#include <float.h>
Packit 6c4009
#include <ieee754.h>
Packit 6c4009
#include <math.h>
Packit 6c4009
#include <stdio.h>
Packit 6c4009
#include <string.h>
Packit 6c4009
#include <math-tests.h>
Packit 6c4009
Packit 6c4009
Packit 6c4009
static int
Packit 6c4009
do_test (void)
Packit 6c4009
{
Packit 6c4009
  int result = 0;
Packit 6c4009
Packit 6c4009
#if LDBL_MANT_DIG > DBL_MANT_DIG
Packit 6c4009
  {
Packit 6c4009
    long double x = 0x100000001ll + (long double) 0.5;
Packit 6c4009
    long double q;
Packit 6c4009
    long double r;
Packit 6c4009
Packit 6c4009
    r = modfl (x, &q);
Packit 6c4009
    if (q != (long double) 0x100000001ll || r != 0.5)
Packit 6c4009
      {
Packit 6c4009
	printf ("modfl (%Lg, ...) failed\n", x);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
  }
Packit 6c4009
Packit 6c4009
  {
Packit 6c4009
    long double x;
Packit 6c4009
    long double m;
Packit 6c4009
    long double r;
Packit 6c4009
    int e;
Packit 6c4009
    int i;
Packit 6c4009
Packit 6c4009
# if LDBL_MANT_DIG == 64
Packit 6c4009
    m = 0xf.fffffffffffffffp-4L;
Packit 6c4009
# elif LDBL_MANT_DIG == 106
Packit 6c4009
    /* This has to match the mantissa of LDBL_MAX which actually does have a
Packit 6c4009
       missing bit in the middle.  */
Packit 6c4009
    m = 0x1.fffffffffffff7ffffffffffff8p-1L;
Packit 6c4009
# elif LDBL_MANT_DIG == 113
Packit 6c4009
    m = 0x1.ffffffffffffffffffffffffffffp-1L;
Packit 6c4009
# else
Packit 6c4009
#  error "Unsupported LDBL_MANT_DIG, please adjust"
Packit 6c4009
# endif
Packit 6c4009
Packit 6c4009
    for (i = LDBL_MAX_EXP, x = LDBL_MAX; i >= LDBL_MIN_EXP; --i, x /= 2.0L)
Packit 6c4009
      {
Packit 6c4009
	printf ("2^%d: ", i);
Packit 6c4009
Packit 6c4009
	r = frexpl (x, &e);
Packit 6c4009
	if (r != m)
Packit 6c4009
	  {
Packit 6c4009
	    printf ("mantissa incorrect: %.20La\n", r);
Packit 6c4009
	    result = 1;
Packit 6c4009
	    continue;
Packit 6c4009
	  }
Packit 6c4009
	if (e != i)
Packit 6c4009
	  {
Packit 6c4009
	    printf ("exponent wrong %d (%.20Lg)\n", e, x);
Packit 6c4009
	    result = 1;
Packit 6c4009
	    continue;
Packit 6c4009
	  }
Packit 6c4009
	puts ("ok");
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    for (i = LDBL_MIN_EXP, x = LDBL_MIN; i >= LDBL_MIN_EXP - LDBL_MANT_DIG + 1;
Packit 6c4009
	 --i, x /= 2.0L)
Packit 6c4009
      {
Packit 6c4009
        printf ("2^%d: ", i);
Packit 6c4009
Packit 6c4009
        r = frexpl (x, &e);
Packit 6c4009
        if (r != 0.5L)
Packit 6c4009
          {
Packit 6c4009
            printf ("mantissa incorrect: %.20La\n", r);
Packit 6c4009
            result = 1;
Packit 6c4009
            continue;
Packit 6c4009
          }
Packit 6c4009
        if (e != i)
Packit 6c4009
          {
Packit 6c4009
            printf ("exponent wrong %d (%.20Lg)\n", e, x);
Packit 6c4009
            result = 1;
Packit 6c4009
            continue;
Packit 6c4009
          }
Packit 6c4009
        puts ("ok");
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
  }
Packit 6c4009
Packit 6c4009
# if 0
Packit 6c4009
  {
Packit 6c4009
    int e;
Packit 6c4009
    long double r = frexpl (LDBL_MIN * LDBL_EPSILON, &e);
Packit 6c4009
Packit 6c4009
    if (r != 0.5)
Packit 6c4009
      {
Packit 6c4009
	printf ("frexpl (LDBL_MIN * LDBL_EPSILON, ...): mantissa wrong: %Lg\n",
Packit 6c4009
		r);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    else if (e != -16444)
Packit 6c4009
      {
Packit 6c4009
	printf ("frexpl (LDBL_MIN * LDBL_EPSILON, ...): exponent wrong: %d\n",
Packit 6c4009
		e);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
  }
Packit 6c4009
# endif
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
  {
Packit 6c4009
    double x = 0x100000001ll + (double) 0.5;
Packit 6c4009
    double q;
Packit 6c4009
    double r;
Packit 6c4009
Packit 6c4009
    r = modf (x, &q);
Packit 6c4009
    if (q != (double) 0x100000001ll || r != 0.5)
Packit 6c4009
      {
Packit 6c4009
	printf ("modf (%g, ...) failed\n", x);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
  }
Packit 6c4009
Packit 6c4009
  {
Packit 6c4009
    union ieee754_float v1;
Packit 6c4009
    union ieee754_float v2;
Packit 6c4009
    float f;
Packit 6c4009
Packit 6c4009
    v1.f = f = FLT_MIN;
Packit 6c4009
    if (fpclassify (f) != FP_NORMAL)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (FLT_MIN) failed: %d\n", fpclassify (f));
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    f = nextafterf (f, FLT_MIN / 2.0f);
Packit 6c4009
    if (fpclassify (f) != FP_SUBNORMAL)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (FLT_MIN-epsilon) failed: %d\n", fpclassify (f));
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    v2.f = f = nextafterf (f, FLT_MIN);
Packit 6c4009
    if (fpclassify (f) != FP_NORMAL)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (FLT_MIN-epsilon+epsilon) failed: %d\n",
Packit 6c4009
		fpclassify (f));
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    if (v1.ieee.mantissa != v2.ieee.mantissa)
Packit 6c4009
      {
Packit 6c4009
	printf ("FLT_MIN: mantissa differs: %8x vs %8x\n",
Packit 6c4009
		v1.ieee.mantissa, v2.ieee.mantissa);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.exponent != v2.ieee.exponent)
Packit 6c4009
      {
Packit 6c4009
	printf ("FLT_MIN: exponent differs: %4x vs %4x\n",
Packit 6c4009
		v1.ieee.exponent, v2.ieee.exponent);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.negative != v2.ieee.negative)
Packit 6c4009
      {
Packit 6c4009
	printf ("FLT_MIN: negative differs: %d vs %d\n",
Packit 6c4009
		v1.ieee.negative, v2.ieee.negative);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    v1.f = f = -FLT_MIN;
Packit 6c4009
    if (fpclassify (f) != FP_NORMAL)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (-FLT_MIN) failed: %d\n", fpclassify (f));
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    f = nextafterf (f, -FLT_MIN / 2.0f);
Packit 6c4009
    if (fpclassify (f) != FP_SUBNORMAL)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (-FLT_MIN-epsilon) failed: %d\n", fpclassify (f));
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    v2.f = f = nextafterf (f, -FLT_MIN);
Packit 6c4009
    if (fpclassify (f) != FP_NORMAL)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (-FLT_MIN-epsilon+epsilon) failed: %d\n",
Packit 6c4009
		fpclassify (f));
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    if (v1.ieee.mantissa != v2.ieee.mantissa)
Packit 6c4009
      {
Packit 6c4009
	printf ("-FLT_MIN: mantissa differs: %8x vs %8x\n",
Packit 6c4009
		v1.ieee.mantissa, v2.ieee.mantissa);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.exponent != v2.ieee.exponent)
Packit 6c4009
      {
Packit 6c4009
	printf ("-FLT_MIN: exponent differs: %4x vs %4x\n",
Packit 6c4009
		v1.ieee.exponent, v2.ieee.exponent);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.negative != v2.ieee.negative)
Packit 6c4009
      {
Packit 6c4009
	printf ("-FLT_MIN: negative differs: %d vs %d\n",
Packit 6c4009
		v1.ieee.negative, v2.ieee.negative);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    f = FLT_MAX;
Packit 6c4009
    if (fpclassify (f) != FP_NORMAL)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (FLT_MAX) failed: %d\n", fpclassify (f));
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    f = nextafterf (f, INFINITY);
Packit 6c4009
    if (fpclassify (f) != FP_INFINITE)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (FLT_MAX+epsilon) failed: %d\n", fpclassify (f));
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    f = -FLT_MAX;
Packit 6c4009
    if (fpclassify (f) != FP_NORMAL)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (-FLT_MAX) failed: %d\n", fpclassify (f));
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    f = nextafterf (f, -INFINITY);
Packit 6c4009
    if (fpclassify (f) != FP_INFINITE)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (-FLT_MAX-epsilon) failed: %d\n", fpclassify (f));
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    v1.f = f = 0.0625;
Packit 6c4009
    f = nextafterf (f, 0.0);
Packit 6c4009
    v2.f = f = nextafterf (f, 1.0);
Packit 6c4009
Packit 6c4009
    if (v1.ieee.mantissa != v2.ieee.mantissa)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0625f down: mantissa differs: %8x vs %8x\n",
Packit 6c4009
		v1.ieee.mantissa, v2.ieee.mantissa);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.exponent != v2.ieee.exponent)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0625f down: exponent differs: %4x vs %4x\n",
Packit 6c4009
		v1.ieee.exponent, v2.ieee.exponent);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.negative != v2.ieee.negative)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0625f down: negative differs: %d vs %d\n",
Packit 6c4009
		v1.ieee.negative, v2.ieee.negative);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    v1.f = f = 0.0625;
Packit 6c4009
    f = nextafterf (f, 1.0);
Packit 6c4009
    v2.f = f = nextafterf (f, 0.0);
Packit 6c4009
Packit 6c4009
    if (v1.ieee.mantissa != v2.ieee.mantissa)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0625f up: mantissa differs: %8x vs %8x\n",
Packit 6c4009
		v1.ieee.mantissa, v2.ieee.mantissa);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.exponent != v2.ieee.exponent)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0625f up: exponent differs: %4x vs %4x\n",
Packit 6c4009
		v1.ieee.exponent, v2.ieee.exponent);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.negative != v2.ieee.negative)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0625f up: negative differs: %d vs %d\n",
Packit 6c4009
		v1.ieee.negative, v2.ieee.negative);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    v1.f = f = -0.0625;
Packit 6c4009
    f = nextafterf (f, 0.0);
Packit 6c4009
    v2.f = f = nextafterf (f, -1.0);
Packit 6c4009
Packit 6c4009
    if (v1.ieee.mantissa != v2.ieee.mantissa)
Packit 6c4009
      {
Packit 6c4009
	printf ("-0.0625f up: mantissa differs: %8x vs %8x\n",
Packit 6c4009
		v1.ieee.mantissa, v2.ieee.mantissa);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.exponent != v2.ieee.exponent)
Packit 6c4009
      {
Packit 6c4009
	printf ("-0.0625f up: exponent differs: %4x vs %4x\n",
Packit 6c4009
		v1.ieee.exponent, v2.ieee.exponent);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.negative != v2.ieee.negative)
Packit 6c4009
      {
Packit 6c4009
	printf ("-0.0625f up: negative differs: %d vs %d\n",
Packit 6c4009
		v1.ieee.negative, v2.ieee.negative);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    v1.f = f = -0.0625;
Packit 6c4009
    f = nextafterf (f, -1.0);
Packit 6c4009
    v2.f = f = nextafterf (f, 0.0);
Packit 6c4009
Packit 6c4009
    if (v1.ieee.mantissa != v2.ieee.mantissa)
Packit 6c4009
      {
Packit 6c4009
	printf ("-0.0625f down: mantissa differs: %8x vs %8x\n",
Packit 6c4009
		v1.ieee.mantissa, v2.ieee.mantissa);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.exponent != v2.ieee.exponent)
Packit 6c4009
      {
Packit 6c4009
	printf ("-0.0625f down: exponent differs: %4x vs %4x\n",
Packit 6c4009
		v1.ieee.exponent, v2.ieee.exponent);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.negative != v2.ieee.negative)
Packit 6c4009
      {
Packit 6c4009
	printf ("-0.0625f down: negative differs: %d vs %d\n",
Packit 6c4009
		v1.ieee.negative, v2.ieee.negative);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    v1.f = f = 0.0f;
Packit 6c4009
    f = nextafterf (f, 1.0);
Packit 6c4009
    v2.f = nextafterf (f, -1.0);
Packit 6c4009
Packit 6c4009
    if (v1.ieee.mantissa != v2.ieee.mantissa)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0f up: mantissa differs: %8x vs %8x\n",
Packit 6c4009
		v1.ieee.mantissa, v2.ieee.mantissa);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.exponent != v2.ieee.exponent)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0f up: exponent differs: %4x vs %4x\n",
Packit 6c4009
		v1.ieee.exponent, v2.ieee.exponent);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (0 != v2.ieee.negative)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0f up: negative differs: 0 vs %d\n",
Packit 6c4009
		v2.ieee.negative);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    v1.f = f = 0.0f;
Packit 6c4009
    f = nextafterf (f, -1.0);
Packit 6c4009
    v2.f = nextafterf (f, 1.0);
Packit 6c4009
Packit 6c4009
    if (v1.ieee.mantissa != v2.ieee.mantissa)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0f down: mantissa differs: %8x vs %8x\n",
Packit 6c4009
		v1.ieee.mantissa, v2.ieee.mantissa);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.exponent != v2.ieee.exponent)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0f down: exponent differs: %4x vs %4x\n",
Packit 6c4009
		v1.ieee.exponent, v2.ieee.exponent);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (1 != v2.ieee.negative)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0f down: negative differs: 1 vs %d\n",
Packit 6c4009
		v2.ieee.negative);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    if (nextafterf (0.0f, INFINITY) != nextafterf (0.0f, 1.0f)
Packit 6c4009
        || nextafterf (-0.0f, INFINITY) != nextafterf (-0.0f, 1.0f)
Packit 6c4009
        || nextafterf (0.0f, -INFINITY) != nextafterf (0.0f, -1.0f)
Packit 6c4009
        || nextafterf (-0.0f, -INFINITY) != nextafterf (-0.0f, -1.0f))
Packit 6c4009
      {
Packit 6c4009
	printf ("nextafterf (+-0, +-Inf) != nextafterf (+-0, +-1)\n");
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    if (nexttowardf (0.0f, INFINITY) != nexttowardf (0.0f, 1.0f)
Packit 6c4009
        || nexttowardf (-0.0f, INFINITY) != nexttowardf (-0.0f, 1.0f)
Packit 6c4009
        || nexttowardf (0.0f, -INFINITY) != nexttowardf (0.0f, -1.0f)
Packit 6c4009
        || nexttowardf (-0.0f, -INFINITY) != nexttowardf (-0.0f, -1.0f))
Packit 6c4009
      {
Packit 6c4009
	printf ("nexttowardf (+-0, +-Inf) != nexttowardf (+-0, +-1)\n");
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
  }
Packit 6c4009
Packit 6c4009
  {
Packit 6c4009
    union ieee754_double v1;
Packit 6c4009
    union ieee754_double v2;
Packit 6c4009
    double d;
Packit 6c4009
Packit 6c4009
    v1.d = d = DBL_MIN;
Packit 6c4009
    if (fpclassify (d) != FP_NORMAL)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (DBL_MIN) failed: %d\n", fpclassify (d));
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    d = nextafter (d, DBL_MIN / 2.0);
Packit 6c4009
    if (fpclassify (d) != FP_SUBNORMAL)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (DBL_MIN-epsilon) failed: %d\n", fpclassify (d));
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    v2.d = d = nextafter (d, DBL_MIN);
Packit 6c4009
    if (fpclassify (d) != FP_NORMAL)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (DBL_MIN-epsilon+epsilon) failed: %d\n",
Packit 6c4009
		fpclassify (d));
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
Packit 6c4009
      {
Packit 6c4009
	printf ("DBL_MIN: mantissa0 differs: %8x vs %8x\n",
Packit 6c4009
		v1.ieee.mantissa0, v2.ieee.mantissa0);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
Packit 6c4009
      {
Packit 6c4009
	printf ("DBL_MIN: mantissa1 differs: %8x vs %8x\n",
Packit 6c4009
		v1.ieee.mantissa1, v2.ieee.mantissa1);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.exponent != v2.ieee.exponent)
Packit 6c4009
      {
Packit 6c4009
	printf ("DBL_MIN: exponent differs: %4x vs %4x\n",
Packit 6c4009
		v1.ieee.exponent, v2.ieee.exponent);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.negative != v2.ieee.negative)
Packit 6c4009
      {
Packit 6c4009
	printf ("DBL_MIN: negative differs: %d vs %d\n",
Packit 6c4009
		v1.ieee.negative, v2.ieee.negative);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    v1.d = d = -DBL_MIN;
Packit 6c4009
    if (fpclassify (d) != FP_NORMAL)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (-DBL_MIN) failed: %d\n", fpclassify (d));
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    d = nextafter (d, -DBL_MIN / 2.0);
Packit 6c4009
    if (fpclassify (d) != FP_SUBNORMAL)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (-DBL_MIN-epsilon) failed: %d\n", fpclassify (d));
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    v2.d = d = nextafter (d, -DBL_MIN);
Packit 6c4009
    if (fpclassify (d) != FP_NORMAL)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (-DBL_MIN-epsilon+epsilon) failed: %d\n",
Packit 6c4009
		fpclassify (d));
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
Packit 6c4009
      {
Packit 6c4009
	printf ("-DBL_MIN: mantissa0 differs: %8x vs %8x\n",
Packit 6c4009
		v1.ieee.mantissa0, v2.ieee.mantissa0);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
Packit 6c4009
      {
Packit 6c4009
	printf ("-DBL_MIN: mantissa1 differs: %8x vs %8x\n",
Packit 6c4009
		v1.ieee.mantissa1, v2.ieee.mantissa1);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.exponent != v2.ieee.exponent)
Packit 6c4009
      {
Packit 6c4009
	printf ("-DBL_MIN: exponent differs: %4x vs %4x\n",
Packit 6c4009
		v1.ieee.exponent, v2.ieee.exponent);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.negative != v2.ieee.negative)
Packit 6c4009
      {
Packit 6c4009
	printf ("-DBL_MIN: negative differs: %d vs %d\n",
Packit 6c4009
		v1.ieee.negative, v2.ieee.negative);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    d = DBL_MAX;
Packit 6c4009
    if (fpclassify (d) != FP_NORMAL)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (DBL_MAX) failed: %d\n", fpclassify (d));
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    d = nextafter (d, INFINITY);
Packit 6c4009
    if (fpclassify (d) != FP_INFINITE)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (DBL_MAX+epsilon) failed: %d\n", fpclassify (d));
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    d = -DBL_MAX;
Packit 6c4009
    if (fpclassify (d) != FP_NORMAL)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (-DBL_MAX) failed: %d\n", fpclassify (d));
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    d = nextafter (d, -INFINITY);
Packit 6c4009
    if (fpclassify (d) != FP_INFINITE)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (-DBL_MAX-epsilon) failed: %d\n", fpclassify (d));
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    v1.d = d = 0.0625;
Packit 6c4009
    d = nextafter (d, 0.0);
Packit 6c4009
    v2.d = d = nextafter (d, 1.0);
Packit 6c4009
Packit 6c4009
    if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0625 down: mantissa0 differs: %8x vs %8x\n",
Packit 6c4009
		v1.ieee.mantissa0, v2.ieee.mantissa0);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0625 down: mantissa1 differs: %8x vs %8x\n",
Packit 6c4009
		v1.ieee.mantissa1, v2.ieee.mantissa1);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.exponent != v2.ieee.exponent)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0625 down: exponent differs: %4x vs %4x\n",
Packit 6c4009
		v1.ieee.exponent, v2.ieee.exponent);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.negative != v2.ieee.negative)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0625 down: negative differs: %d vs %d\n",
Packit 6c4009
		v1.ieee.negative, v2.ieee.negative);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    v1.d = d = 0.0625;
Packit 6c4009
    d = nextafter (d, 1.0);
Packit 6c4009
    v2.d = d = nextafter (d, 0.0);
Packit 6c4009
Packit 6c4009
    if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0625 up: mantissa0 differs: %8x vs %8x\n",
Packit 6c4009
		v1.ieee.mantissa0, v2.ieee.mantissa0);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0625 up: mantissa1 differs: %8x vs %8x\n",
Packit 6c4009
		v1.ieee.mantissa1, v2.ieee.mantissa1);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.exponent != v2.ieee.exponent)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0625 up: exponent differs: %4x vs %4x\n",
Packit 6c4009
		v1.ieee.exponent, v2.ieee.exponent);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.negative != v2.ieee.negative)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0625 up: negative differs: %d vs %d\n",
Packit 6c4009
		v1.ieee.negative, v2.ieee.negative);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    v1.d = d = -0.0625;
Packit 6c4009
    d = nextafter (d, 0.0);
Packit 6c4009
    v2.d = d = nextafter (d, -1.0);
Packit 6c4009
Packit 6c4009
    if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
Packit 6c4009
      {
Packit 6c4009
	printf ("-0.0625 up: mantissa0 differs: %8x vs %8x\n",
Packit 6c4009
		v1.ieee.mantissa0, v2.ieee.mantissa0);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
Packit 6c4009
      {
Packit 6c4009
	printf ("-0.0625 up: mantissa1 differs: %8x vs %8x\n",
Packit 6c4009
		v1.ieee.mantissa1, v2.ieee.mantissa1);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.exponent != v2.ieee.exponent)
Packit 6c4009
      {
Packit 6c4009
	printf ("-0.0625 up: exponent differs: %4x vs %4x\n",
Packit 6c4009
		v1.ieee.exponent, v2.ieee.exponent);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.negative != v2.ieee.negative)
Packit 6c4009
      {
Packit 6c4009
	printf ("-0.0625 up: negative differs: %d vs %d\n",
Packit 6c4009
		v1.ieee.negative, v2.ieee.negative);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    v1.d = d = -0.0625;
Packit 6c4009
    d = nextafter (d, -1.0);
Packit 6c4009
    v2.d = d = nextafter (d, 0.0);
Packit 6c4009
Packit 6c4009
    if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
Packit 6c4009
      {
Packit 6c4009
	printf ("-0.0625 down: mantissa0 differs: %8x vs %8x\n",
Packit 6c4009
		v1.ieee.mantissa0, v2.ieee.mantissa0);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
Packit 6c4009
      {
Packit 6c4009
	printf ("-0.0625 down: mantissa1 differs: %8x vs %8x\n",
Packit 6c4009
		v1.ieee.mantissa1, v2.ieee.mantissa1);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.exponent != v2.ieee.exponent)
Packit 6c4009
      {
Packit 6c4009
	printf ("-0.0625 down: exponent differs: %4x vs %4x\n",
Packit 6c4009
		v1.ieee.exponent, v2.ieee.exponent);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.negative != v2.ieee.negative)
Packit 6c4009
      {
Packit 6c4009
	printf ("-0.0625 down: negative differs: %d vs %d\n",
Packit 6c4009
		v1.ieee.negative, v2.ieee.negative);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    v1.d = d = 0.0;
Packit 6c4009
    d = nextafter (d, 1.0);
Packit 6c4009
    v2.d = nextafter (d, -1.0);
Packit 6c4009
Packit 6c4009
    if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0 up: mantissa0 differs: %8x vs %8x\n",
Packit 6c4009
		v1.ieee.mantissa0, v2.ieee.mantissa0);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0 up: mantissa1 differs: %8x vs %8x\n",
Packit 6c4009
		v1.ieee.mantissa1, v2.ieee.mantissa1);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.exponent != v2.ieee.exponent)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0 up: exponent differs: %4x vs %4x\n",
Packit 6c4009
		v1.ieee.exponent, v2.ieee.exponent);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (0 != v2.ieee.negative)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0 up: negative differs: 0 vs %d\n",
Packit 6c4009
		v2.ieee.negative);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    v1.d = d = 0.0;
Packit 6c4009
    d = nextafter (d, -1.0);
Packit 6c4009
    v2.d = nextafter (d, 1.0);
Packit 6c4009
Packit 6c4009
    if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0 down: mantissa0 differs: %8x vs %8x\n",
Packit 6c4009
		v1.ieee.mantissa0, v2.ieee.mantissa0);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0 down: mantissa1 differs: %8x vs %8x\n",
Packit 6c4009
		v1.ieee.mantissa1, v2.ieee.mantissa1);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (v1.ieee.exponent != v2.ieee.exponent)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0 down: exponent differs: %4x vs %4x\n",
Packit 6c4009
		v1.ieee.exponent, v2.ieee.exponent);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (1 != v2.ieee.negative)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0 down: negative differs: 1 vs %d\n",
Packit 6c4009
		v2.ieee.negative);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    if (nextafter (0.0, INFINITY) != nextafter (0.0, 1.0)
Packit 6c4009
        || nextafter (-0.0, INFINITY) != nextafter (-0.0, 1.0)
Packit 6c4009
        || nextafter (0.0, -INFINITY) != nextafter (0.0, -1.0)
Packit 6c4009
        || nextafter (-0.0, -INFINITY) != nextafter (-0.0, -1.0))
Packit 6c4009
      {
Packit 6c4009
	printf ("nextafter (+-0, +-Inf) != nextafter (+-0, +-1)\n");
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    if (nexttoward (0.0, INFINITY) != nexttoward (0.0, 1.0)
Packit 6c4009
        || nexttoward (-0.0, INFINITY) != nexttoward (-0.0, 1.0)
Packit 6c4009
        || nexttoward (0.0, -INFINITY) != nexttoward (0.0, -1.0)
Packit 6c4009
        || nexttoward (-0.0, -INFINITY) != nexttoward (-0.0, -1.0))
Packit 6c4009
      {
Packit 6c4009
	printf ("nexttoward (+-0, +-Inf) != nexttoward (+-0, +-1)\n");
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
  }
Packit 6c4009
Packit 6c4009
#if LDBL_MANT_DIG > DBL_MANT_DIG
Packit 6c4009
  {
Packit 6c4009
    long double v1, v2;
Packit 6c4009
Packit 6c4009
    v1 = LDBL_MIN;
Packit 6c4009
    if (fpclassify (v1) != FP_NORMAL)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (LDBL_MIN) failed: %d (%La)\n",
Packit 6c4009
		fpclassify (v1), v1);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    v2 = nextafterl (v1, LDBL_MIN / 2.0);
Packit 6c4009
    if (fpclassify (v2) != FP_SUBNORMAL)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (LDBL_MIN-epsilon) failed: %d (%La)\n",
Packit 6c4009
		fpclassify (v2), v2);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    v2 = nextafterl (v2, LDBL_MIN);
Packit 6c4009
    if (fpclassify (v2) != FP_NORMAL)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (LDBL_MIN-epsilon+epsilon) failed: %d (%La)\n",
Packit 6c4009
		fpclassify (v2), v2);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    if (v1 != v2)
Packit 6c4009
      {
Packit 6c4009
	printf ("LDBL_MIN-epsilon+epsilon != LDBL_MIN: %La vs %La\n", v2, v1);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    v1 = -LDBL_MIN;
Packit 6c4009
    if (fpclassify (v1) != FP_NORMAL)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (-LDBL_MIN) failed: %d (%La)\n",
Packit 6c4009
		fpclassify (v1), v1);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    v2 = nextafterl (v1, -LDBL_MIN / 2.0);
Packit 6c4009
    if (fpclassify (v2) != FP_SUBNORMAL)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (-LDBL_MIN-epsilon) failed: %d (%La)\n",
Packit 6c4009
		fpclassify (v2), v2);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    v2 = nextafterl (v2, -LDBL_MIN);
Packit 6c4009
    if (fpclassify (v2) != FP_NORMAL)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (-LDBL_MIN-epsilon+epsilon) failed: %d (%La)\n",
Packit 6c4009
		fpclassify (v2), v2);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    if (v1 != v2)
Packit 6c4009
      {
Packit 6c4009
	printf ("-LDBL_MIN-epsilon+epsilon != -LDBL_MIN: %La vs %La\n", v2, v1);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    v1 = LDBL_MAX;
Packit 6c4009
    if (fpclassify (v1) != FP_NORMAL)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (LDBL_MAX) failed: %d (%La)\n",
Packit 6c4009
		fpclassify (v1), v1);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    v2 = nextafterl (v1, INFINITY);
Packit 6c4009
    if (fpclassify (v2) != FP_INFINITE)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (LDBL_MAX+epsilon) failed: %d (%La)\n",
Packit 6c4009
		fpclassify (v2), v2);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    v1 = -LDBL_MAX;
Packit 6c4009
    if (fpclassify (v1) != FP_NORMAL)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (-LDBL_MAX) failed: %d (%La)\n",
Packit 6c4009
		fpclassify (v1), v1);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    v2 = nextafterl (v1, -INFINITY);
Packit 6c4009
    if (fpclassify (v2) != FP_INFINITE)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (-LDBL_MAX-epsilon) failed: %d (%La)\n",
Packit 6c4009
		fpclassify (v2), v2);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    v1 = 0.0625;
Packit 6c4009
    v2 = nextafterl (v1, 0.0);
Packit 6c4009
    v2 = nextafterl (v2, 1.0);
Packit 6c4009
Packit 6c4009
    if (v1 != v2)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0625L-epsilon+epsilon != 0.0625L: %La vs %La\n", v2, v1);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    v1 = 0.0625;
Packit 6c4009
    v2 = nextafterl (v1, 1.0);
Packit 6c4009
    v2 = nextafterl (v2, 0.0);
Packit 6c4009
Packit 6c4009
    if (v1 != v2)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0625L+epsilon-epsilon != 0.0625L: %La vs %La\n", v2, v1);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    v1 = -0.0625;
Packit 6c4009
    v2 = nextafterl (v1, 0.0);
Packit 6c4009
    v2 = nextafterl (v2, -1.0);
Packit 6c4009
Packit 6c4009
    if (v1 != v2)
Packit 6c4009
      {
Packit 6c4009
	printf ("-0.0625L+epsilon-epsilon != -0.0625L: %La vs %La\n", v2, v1);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    v1 = -0.0625;
Packit 6c4009
    v2 = nextafterl (v1, -1.0);
Packit 6c4009
    v2 = nextafterl (v2, 0.0);
Packit 6c4009
Packit 6c4009
    if (v1 != v2)
Packit 6c4009
      {
Packit 6c4009
	printf ("-0.0625L-epsilon+epsilon != -0.0625L: %La vs %La\n", v2, v1);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    v1 = 0.0;
Packit 6c4009
    v2 = nextafterl (v1, 1.0);
Packit 6c4009
    v2 = nextafterl (v2, -1.0);
Packit 6c4009
Packit 6c4009
    if (v1 != v2)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0+epsilon-epsilon != 0.0L: %La vs %La\n", v2, v1);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (signbit (v2))
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0+epsilon-epsilon is negative\n");
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    v1 = 0.0;
Packit 6c4009
    v2 = nextafterl (v1, -1.0);
Packit 6c4009
    v2 = nextafterl (v2, 1.0);
Packit 6c4009
Packit 6c4009
    if (v1 != v2)
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0-epsilon+epsilon != 0.0L: %La vs %La\n", v2, v1);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    if (!signbit (v2))
Packit 6c4009
      {
Packit 6c4009
	printf ("0.0-epsilon+epsilon is positive\n");
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    if (nextafterl (0.0, INFINITY) != nextafterl (0.0, 1.0)
Packit 6c4009
        || nextafterl (-0.0, INFINITY) != nextafterl (-0.0, 1.0)
Packit 6c4009
        || nextafterl (0.0, -INFINITY) != nextafterl (0.0, -1.0)
Packit 6c4009
        || nextafterl (-0.0, -INFINITY) != nextafterl (-0.0, -1.0))
Packit 6c4009
      {
Packit 6c4009
	printf ("nextafterl (+-0, +-Inf) != nextafterl (+-0, +-1)\n");
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    if (nexttowardl (0.0L, INFINITY) != nexttowardl (0.0L, 1.0L)
Packit 6c4009
        || nexttowardl (-0.0L, INFINITY) != nexttowardl (-0.0L, 1.0L)
Packit 6c4009
        || nexttowardl (0.0L, -INFINITY) != nexttowardl (0.0L, -1.0L)
Packit 6c4009
        || nexttowardl (-0.0L, -INFINITY) != nexttowardl (-0.0L, -1.0L))
Packit 6c4009
      {
Packit 6c4009
	printf ("nexttowardl (+-0, +-Inf) != nexttowardl (+-0, +-1)\n");
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
  }
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
  if (! isnormal (FLT_MIN))
Packit 6c4009
    {
Packit 6c4009
      puts ("isnormal (FLT_MIN) failed");
Packit 6c4009
      result = 1;
Packit 6c4009
    }
Packit 6c4009
  if (! isnormal (DBL_MIN))
Packit 6c4009
    {
Packit 6c4009
      puts ("isnormal (DBL_MIN) failed");
Packit 6c4009
      result = 1;
Packit 6c4009
    }
Packit 6c4009
#if LDBL_MANT_DIG > DBL_MANT_DIG
Packit 6c4009
  if (! isnormal (LDBL_MIN))
Packit 6c4009
    {
Packit 6c4009
      puts ("isnormal (LDBL_MIN) failed");
Packit 6c4009
      result = 1;
Packit 6c4009
    }
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#if defined (__i386__) || defined (__x86_64__)
Packit 6c4009
  /* This is a test for the strange long doubles in x86 FPUs.  */
Packit 6c4009
  {
Packit 6c4009
    union
Packit 6c4009
    {
Packit 6c4009
      char b[10];
Packit 6c4009
      long double d;
Packit 6c4009
    } u =
Packit 6c4009
      { .b = { 0, 0, 0, 0, 0, 0, 0, 0x80, 0, 0 } };
Packit 6c4009
Packit 6c4009
    if (fpclassify (u.d) != FP_NORMAL)
Packit 6c4009
      {
Packit 6c4009
	printf ("fpclassify (0x00008000000000000000) failed: %d (%Lg)\n",
Packit 6c4009
		fpclassify (u.d), u.d);
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
  }
Packit 6c4009
Packit 6c4009
  /* Special qNaNs in x86 long double.  Test for scalbl.  */
Packit 6c4009
  {
Packit 6c4009
    union
Packit 6c4009
    {
Packit 6c4009
      char b[10];
Packit 6c4009
      long double d;
Packit 6c4009
    } u =
Packit 6c4009
      { .b = { 0, 1, 0, 0, 0, 0, 0, 0xc0, 0xff, 0x7f } };
Packit 6c4009
    long double r;
Packit 6c4009
Packit 6c4009
    r = scalbl (u.d, 0.0);
Packit 6c4009
    if (!isnan (r))
Packit 6c4009
      {
Packit 6c4009
	puts ("scalbl (qNaN, 0) does not return NaN");
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    else if (memcmp (&r, &u.d, sizeof (double)) != 0)
Packit 6c4009
      {
Packit 6c4009
	puts ("scalbl (qNaN, 0) does not return the same NaN");
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
  }
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#if LDBL_MANT_DIG > DBL_MANT_DIG
Packit 6c4009
  {
Packit 6c4009
    long double r;
Packit 6c4009
Packit 6c4009
    feclearexcept (FE_ALL_EXCEPT);
Packit 6c4009
    r = scalbl (LDBL_MIN, 2147483647);
Packit 6c4009
    if (! isinf (r))
Packit 6c4009
      {
Packit 6c4009
	puts ("scalbl (LDBL_MIN, 2147483647) does not return Inf");
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    else if (signbit (r) != 0)
Packit 6c4009
      {
Packit 6c4009
	puts ("scalbl (LDBL_MIN, 2147483647) returns -Inf");
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    else if (fetestexcept (FE_UNDERFLOW))
Packit 6c4009
      {
Packit 6c4009
	puts ("scalbl (LDBL_MIN, 2147483647) raises underflow exception");
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
    feclearexcept (FE_ALL_EXCEPT);
Packit 6c4009
    r = scalbl (LDBL_MAX, -2147483647);
Packit 6c4009
    if (r != 0.0)
Packit 6c4009
      {
Packit 6c4009
	puts ("scalbl (LDBL_MAX, -2147483647) does not return 0");
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    else if (signbit (r) != 0)
Packit 6c4009
      {
Packit 6c4009
	puts ("scalbl (LDBL_MAX, -2147483647) returns -Inf");
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
    else if (fetestexcept (FE_OVERFLOW))
Packit 6c4009
      {
Packit 6c4009
	puts ("scalbl (LDBL_MAX, -2147483647) raises overflow exception");
Packit 6c4009
	result = 1;
Packit 6c4009
      }
Packit 6c4009
  }
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
  /* The tests here are very similar to tests earlier in this file,
Packit 6c4009
     the important difference is just that there are no intervening
Packit 6c4009
     union variables that cause some GCC versions to hide possible
Packit 6c4009
     bugs in nextafter* implementation.  */
Packit 6c4009
  if (nextafterf (nextafterf (FLT_MIN, FLT_MIN / 2.0), FLT_MIN) != FLT_MIN)
Packit 6c4009
    {
Packit 6c4009
      puts ("nextafterf FLT_MIN test failed");
Packit 6c4009
      result = 1;
Packit 6c4009
    }
Packit 6c4009
  if (nextafterf (nextafterf (-FLT_MIN, -FLT_MIN / 2.0), -FLT_MIN)
Packit 6c4009
      != -FLT_MIN)
Packit 6c4009
    {
Packit 6c4009
      puts ("nextafterf -FLT_MIN test failed");
Packit 6c4009
      result = 1;
Packit 6c4009
    }
Packit 6c4009
  if (nextafter (nextafter (DBL_MIN, DBL_MIN / 2.0), DBL_MIN) != DBL_MIN)
Packit 6c4009
    {
Packit 6c4009
      puts ("nextafter DBL_MIN test failed");
Packit 6c4009
      result = 1;
Packit 6c4009
    }
Packit 6c4009
  if (nextafter (nextafter (-DBL_MIN, -DBL_MIN / 2.0), -DBL_MIN) != -DBL_MIN)
Packit 6c4009
    {
Packit 6c4009
      puts ("nextafter -DBL_MIN test failed");
Packit 6c4009
      result = 1;
Packit 6c4009
    }
Packit 6c4009
#if LDBL_MANT_DIG > DBL_MANT_DIG
Packit 6c4009
  if (nextafterl (nextafterl (LDBL_MIN, LDBL_MIN / 2.0), LDBL_MIN)
Packit 6c4009
      != LDBL_MIN)
Packit 6c4009
    {
Packit 6c4009
      puts ("nextafterl LDBL_MIN test failed");
Packit 6c4009
      result = 1;
Packit 6c4009
    }
Packit 6c4009
  if (nextafterl (nextafterl (-LDBL_MIN, -LDBL_MIN / 2.0), -LDBL_MIN)
Packit 6c4009
      != -LDBL_MIN)
Packit 6c4009
    {
Packit 6c4009
      puts ("nextafterl -LDBL_MIN test failed");
Packit 6c4009
      result = 1;
Packit 6c4009
    }
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
  volatile float f1 = FLT_MAX;
Packit 6c4009
  volatile float f2 = FLT_MAX / 2;
Packit 6c4009
  (void) &f1;
Packit 6c4009
  (void) &f2;
Packit 6c4009
  feclearexcept (FE_ALL_EXCEPT);
Packit 6c4009
  f2 += f1;
Packit 6c4009
#if defined(FE_OVERFLOW) && defined(FE_INEXACT)
Packit 6c4009
  int fe = fetestexcept (FE_ALL_EXCEPT);
Packit 6c4009
  if (EXCEPTION_TESTS (float) && fe != (FE_OVERFLOW | FE_INEXACT))
Packit 6c4009
    {
Packit 6c4009
      printf ("float overflow test failed: %x\n", fe);
Packit 6c4009
      result = 1;
Packit 6c4009
    }
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
  volatile double d1 = DBL_MAX;
Packit 6c4009
  volatile double d2 = DBL_MAX / 2;
Packit 6c4009
  (void) &d1;
Packit 6c4009
  (void) &d2;
Packit 6c4009
  feclearexcept (FE_ALL_EXCEPT);
Packit 6c4009
  d2 += d1;
Packit 6c4009
#if defined(FE_OVERFLOW) && defined(FE_INEXACT)
Packit 6c4009
  fe = fetestexcept (FE_ALL_EXCEPT);
Packit 6c4009
  if (EXCEPTION_TESTS (double) && fe != (FE_OVERFLOW | FE_INEXACT))
Packit 6c4009
    {
Packit 6c4009
      printf ("double overflow test failed: %x\n", fe);
Packit 6c4009
      result = 1;
Packit 6c4009
    }
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#if LDBL_MANT_DIG > DBL_MANT_DIG
Packit 6c4009
  volatile long double ld1 = LDBL_MAX;
Packit 6c4009
  volatile long double ld2 = LDBL_MAX / 2;
Packit 6c4009
  (void) &ld1;
Packit 6c4009
  (void) &ld2;
Packit 6c4009
  feclearexcept (FE_ALL_EXCEPT);
Packit 6c4009
  ld2 += ld1;
Packit 6c4009
# if defined(FE_OVERFLOW) && defined(FE_INEXACT)
Packit 6c4009
  fe = fetestexcept (FE_ALL_EXCEPT);
Packit 6c4009
  if (EXCEPTION_TESTS (long double) && fe != (FE_OVERFLOW | FE_INEXACT))
Packit 6c4009
    {
Packit 6c4009
      printf ("long double overflow test failed: %x\n", fe);
Packit 6c4009
      result = 1;
Packit 6c4009
    }
Packit 6c4009
# endif
Packit 6c4009
Packit 6c4009
# if LDBL_MANT_DIG == 113
Packit 6c4009
  volatile long double ld3 = 0x1.0000000000010000000100000001p+1;
Packit 6c4009
  volatile long double ld4 = 0x1.0000000000000000000000000001p+1;
Packit 6c4009
  (void) &ld3;
Packit 6c4009
  (void) &ld4;
Packit 6c4009
  ld3 -= ld4;
Packit 6c4009
  if (ld3 != 0x1.0p-47)
Packit 6c4009
    {
Packit 6c4009
      printf ("long double subtraction test failed %.28La\n", ld3);
Packit 6c4009
      result = 1;
Packit 6c4009
    }
Packit 6c4009
# endif
Packit 6c4009
Packit 6c4009
/* Skip testing IBM long double format, for 2 reasons:
Packit 6c4009
   1) it only supports FE_TONEAREST
Packit 6c4009
   2) nextafter (0.0, 1.0) == nextafterl (0.0L, 1.0L), so
Packit 6c4009
      nextafter (0.0, 1.0) / 16.0L will be 0.0L.  */
Packit 6c4009
# if LDBL_MANT_DIG >= DBL_MANT_DIG + 4 && LDBL_MANT_DIG != 106
Packit 6c4009
  int oldmode = fegetround ();
Packit 6c4009
  int j;
Packit 6c4009
  for (j = 0; j < 4; j++)
Packit 6c4009
    {
Packit 6c4009
      int mode;
Packit 6c4009
      int i;
Packit 6c4009
      int k = 0;
Packit 6c4009
      const char *mstr;
Packit 6c4009
      switch (j)
Packit 6c4009
	{
Packit 6c4009
#ifdef FE_TONEAREST
Packit 6c4009
	case 0:
Packit 6c4009
	  mode = FE_TONEAREST;
Packit 6c4009
	  mstr = "nearest";
Packit 6c4009
	  k = 8;
Packit 6c4009
	  break;
Packit 6c4009
#endif
Packit 6c4009
#ifdef FE_DOWNWARD
Packit 6c4009
	case 1:
Packit 6c4009
	  mode = FE_DOWNWARD;
Packit 6c4009
	  mstr = "-inf";
Packit 6c4009
	  break;
Packit 6c4009
#endif
Packit 6c4009
#ifdef FE_UPWARD
Packit 6c4009
	case 2:
Packit 6c4009
	  mode = FE_UPWARD;
Packit 6c4009
	  mstr = "+inf";
Packit 6c4009
	  k = 15;
Packit 6c4009
	  break;
Packit 6c4009
#endif
Packit 6c4009
#ifdef FE_TOWARDZERO
Packit 6c4009
	case 3:
Packit 6c4009
	  mode = FE_TOWARDZERO;
Packit 6c4009
	  mstr = "0";
Packit 6c4009
	  break;
Packit 6c4009
#endif
Packit 6c4009
	default:
Packit 6c4009
	  continue;
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      volatile long double ld5 = nextafter (0.0, 1.0) / 16.0L;
Packit 6c4009
      volatile double d5;
Packit 6c4009
      (void) &ld5;
Packit 6c4009
      for (i = 0; i <= 32; i++)
Packit 6c4009
	{
Packit 6c4009
	  if (fesetround (mode))
Packit 6c4009
	    {
Packit 6c4009
	      printf ("failed to set rounding mode to %s\n", mstr);
Packit 6c4009
	      if (ROUNDING_TESTS (long double, mode)
Packit 6c4009
		  && ROUNDING_TESTS (double, mode))
Packit 6c4009
		result = 1;
Packit 6c4009
	      else
Packit 6c4009
		puts ("ignoring this failure");
Packit 6c4009
	      break;
Packit 6c4009
	    }
Packit 6c4009
	  d5 = ld5 * i;
Packit 6c4009
	  (void) &d5;
Packit 6c4009
	  fesetround (oldmode);
Packit 6c4009
	  if (d5 != ((j == 0 && i == 8) ? 0 : (i + k) / 16)
Packit 6c4009
		    * nextafter (0.0, 1.0))
Packit 6c4009
	    {
Packit 6c4009
	      printf ("%La incorrectly rounded to %s as %a\n",
Packit 6c4009
		      ld5 * i, mstr, d5);
Packit 6c4009
	      if (ROUNDING_TESTS (long double, mode)
Packit 6c4009
		  && ROUNDING_TESTS (double, mode))
Packit 6c4009
		result = 1;
Packit 6c4009
	      else
Packit 6c4009
		puts ("ignoring this failure");
Packit 6c4009
	    }
Packit 6c4009
	}
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  volatile long double ld7 = nextafterl (0.0L, 1.0L);
Packit 6c4009
  volatile double d7;
Packit 6c4009
  (void) &ld7;
Packit 6c4009
  fesetround (FE_UPWARD);
Packit 6c4009
  d7 = ld7;
Packit 6c4009
  (void) &d7;
Packit 6c4009
  fesetround (oldmode);
Packit 6c4009
Packit 6c4009
  if (d7 != nextafter (0.0, 1.0))
Packit 6c4009
    {
Packit 6c4009
      printf ("%La incorrectly rounded upward to %a\n", ld7, d7);
Packit 6c4009
      if (ROUNDING_TESTS (long double, FE_UPWARD)
Packit 6c4009
	  && ROUNDING_TESTS (double, FE_UPWARD))
Packit 6c4009
	result = 1;
Packit 6c4009
      else
Packit 6c4009
	puts ("ignoring this failure");
Packit 6c4009
    }
Packit 6c4009
# endif
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
  return result;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
#define TEST_FUNCTION do_test ()
Packit 6c4009
#include "../test-skeleton.c"