/* Test of rounding towards zero.
- Copyright (C) 2007-2008 Free Software Foundation, Inc.
+ Copyright (C) 2007-2010 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
-#include <stdlib.h>
#include "isnanf-nolibm.h"
-
-#define ASSERT(expr) \
- do \
- { \
- if (!(expr)) \
- { \
- fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \
- fflush (stderr); \
- abort (); \
- } \
- } \
- while (0)
+#include "macros.h"
/* The reference implementation, taken from lib/trunc.c. */
{
/* Avoid rounding errors for values near 2^k, where k >= MANT_DIG-1. */
if (z < TWO_MANT_DIG)
- {
- /* Round to the next integer (nearest or up or down, doesn't matter). */
- z += TWO_MANT_DIG;
- z -= TWO_MANT_DIG;
- /* Enforce rounding down. */
- if (z > y)
- z -= L_(1.0);
- }
+ {
+ /* Round to the next integer (nearest or up or down, doesn't matter). */
+ z += TWO_MANT_DIG;
+ z -= TWO_MANT_DIG;
+ /* Enforce rounding down. */
+ if (z > y)
+ z -= L_(1.0);
+ }
}
else if (z < L_(0.0))
{
/* Avoid rounding errors for values near -2^k, where k >= MANT_DIG-1. */
if (z > - TWO_MANT_DIG)
- {
- /* Round to the next integer (nearest or up or down, doesn't matter). */
- z -= TWO_MANT_DIG;
- z += TWO_MANT_DIG;
- /* Enforce rounding up. */
- if (z < y)
- z += L_(1.0);
- }
+ {
+ /* Round to the next integer (nearest or up or down, doesn't matter). */
+ z -= TWO_MANT_DIG;
+ z += TWO_MANT_DIG;
+ /* Enforce rounding up. */
+ if (z < y)
+ z += L_(1.0);
+ }
}
return z;
}
return
(x >= 0
? (x < 1 ? result == L_(0.0) :
- x - 1 < x ? result <= x && result >= x - 1 && x - result < 1 :
- equal (result, x))
+ x - 1 < x ? result <= x && result >= x - 1 && x - result < 1 :
+ equal (result, x))
: (x > -1 ? result == L_(0.0) :
- x + 1 > x ? result >= x && result <= x + 1 && result - x < 1 :
- equal (result, x)));
+ x + 1 > x ? result >= x && result <= x + 1 && result - x < 1 :
+ equal (result, x)));
}
/* Test the function for a given argument. */
return 0;
else
{
- fprintf (stderr, "truncf %g(%a) = %g(%a) or %g(%a)?\n",
- x, x, reference, reference, result, result);
- return 1;
+ fprintf (stderr, "truncf %g(%a) = %g(%a) or %g(%a)?\n",
+ x, x, reference, reference, result, result);
+ return 1;
}
}
}
for (highbits = 0; highbits < (1 << NUM_HIGHBITS); highbits++)
for (lowbits = 0; lowbits < (1 << NUM_LOWBITS); lowbits++)
{
- /* Combine highbits and lowbits into a floating-point number,
- sign-extending the lowbits to 32-NUM_HIGHBITS bits. */
- union { float f; uint32_t i; } janus;
- janus.i = ((uint32_t) highbits << (32 - NUM_HIGHBITS))
- | ((uint32_t) ((int32_t) ((uint32_t) lowbits << (32 - NUM_LOWBITS))
- >> (32 - NUM_LOWBITS - NUM_HIGHBITS))
- >> NUM_HIGHBITS);
- error |= check (janus.f);
+ /* Combine highbits and lowbits into a floating-point number,
+ sign-extending the lowbits to 32-NUM_HIGHBITS bits. */
+ union { float f; uint32_t i; } janus;
+ janus.i = ((uint32_t) highbits << (32 - NUM_HIGHBITS))
+ | ((uint32_t) ((int32_t) ((uint32_t) lowbits << (32 - NUM_LOWBITS))
+ >> (32 - NUM_LOWBITS - NUM_HIGHBITS))
+ >> NUM_HIGHBITS);
+ error |= check (janus.f);
}
return (error ? 1 : 0);
}