/* Basic test of runtime relational comparisons using simple values that
|
/* Basic test of runtime relational comparisons using simple values that
|
are not affected by rounding. */
|
are not affected by rounding. */
|
|
|
#include <stdlib.h>
|
#include <stdlib.h>
|
|
|
static int failcnt;
|
static int failcnt;
|
|
|
#define PASTE2(A,B) A ## B
|
#define PASTE2(A,B) A ## B
|
#define PASTE(A,B) PASTE2(A,B)
|
#define PASTE(A,B) PASTE2(A,B)
|
|
|
#ifdef DBG
|
#ifdef DBG
|
#include <stdio.h>
|
#include <stdio.h>
|
#define FAILURE(OP,KIND) \
|
#define FAILURE(OP,KIND) \
|
{ printf ("failed at line %d: %s for %s values\n", __LINE__, OP, KIND); \
|
{ printf ("failed at line %d: %s for %s values\n", __LINE__, OP, KIND); \
|
failcnt++; }
|
failcnt++; }
|
#else
|
#else
|
#define FAILURE(OP,KIND) abort ();
|
#define FAILURE(OP,KIND) abort ();
|
#endif
|
#endif
|
|
|
#ifndef WIDTH
|
#ifndef WIDTH
|
#error define WIDTH as decimal float size in bytes
|
#error define WIDTH as decimal float size in bytes
|
#endif
|
#endif
|
|
|
#if WIDTH == 32
|
#if WIDTH == 32
|
#define DTYPE _Decimal32
|
#define DTYPE _Decimal32
|
#define SUFFIX DF
|
#define SUFFIX DF
|
#elif WIDTH == 64
|
#elif WIDTH == 64
|
#define DTYPE _Decimal64
|
#define DTYPE _Decimal64
|
#define SUFFIX DD
|
#define SUFFIX DD
|
#elif WIDTH == 128
|
#elif WIDTH == 128
|
#define DTYPE _Decimal128
|
#define DTYPE _Decimal128
|
#define SUFFIX DL
|
#define SUFFIX DL
|
#elif WIDTH == 0
|
#elif WIDTH == 0
|
/* This is for testing the test using a type known to work. */
|
/* This is for testing the test using a type known to work. */
|
#define DTYPE double
|
#define DTYPE double
|
#define SUFFIX
|
#define SUFFIX
|
#else
|
#else
|
#error invalid width for decimal float type
|
#error invalid width for decimal float type
|
#endif
|
#endif
|
|
|
DTYPE m_two = PASTE(-2.0, SUFFIX);
|
DTYPE m_two = PASTE(-2.0, SUFFIX);
|
DTYPE m_one = PASTE(-1.0, SUFFIX);
|
DTYPE m_one = PASTE(-1.0, SUFFIX);
|
DTYPE zero = PASTE(0.0, SUFFIX);
|
DTYPE zero = PASTE(0.0, SUFFIX);
|
DTYPE one = PASTE(1.0, SUFFIX);
|
DTYPE one = PASTE(1.0, SUFFIX);
|
DTYPE two = PASTE(2.0, SUFFIX);
|
DTYPE two = PASTE(2.0, SUFFIX);
|
|
|
void
|
void
|
test_compares (void)
|
test_compares (void)
|
{
|
{
|
DTYPE x = one;
|
DTYPE x = one;
|
DTYPE y = zero;
|
DTYPE y = zero;
|
DTYPE z = m_one;
|
DTYPE z = m_one;
|
|
|
/* Less than or equal to: comparisons against equal values. */
|
/* Less than or equal to: comparisons against equal values. */
|
|
|
if (! (x <= one)) FAILURE ("<=", "equal")
|
if (! (x <= one)) FAILURE ("<=", "equal")
|
if (! (y <= zero)) FAILURE ("<=", "equal")
|
if (! (y <= zero)) FAILURE ("<=", "equal")
|
if (! (z <= m_one)) FAILURE ("<=", "equal")
|
if (! (z <= m_one)) FAILURE ("<=", "equal")
|
|
|
/* Less than or equal to: comparisons against lesser values. */
|
/* Less than or equal to: comparisons against lesser values. */
|
|
|
if (x <= m_one) FAILURE ("<=", "lesser")
|
if (x <= m_one) FAILURE ("<=", "lesser")
|
if (x <= zero) FAILURE ("<=", "lesser")
|
if (x <= zero) FAILURE ("<=", "lesser")
|
if (y <= m_one) FAILURE ("<=", "lesser")
|
if (y <= m_one) FAILURE ("<=", "lesser")
|
if (z <= m_two) FAILURE ("<=", "lesser")
|
if (z <= m_two) FAILURE ("<=", "lesser")
|
|
|
/* Less than or equal to: comparisons against greater values. */
|
/* Less than or equal to: comparisons against greater values. */
|
|
|
if (! (x <= two)) FAILURE ("<=", "greater")
|
if (! (x <= two)) FAILURE ("<=", "greater")
|
if (! (y <= one)) FAILURE ("<=", "greater")
|
if (! (y <= one)) FAILURE ("<=", "greater")
|
if (! (z <= zero)) FAILURE ("<=", "greater")
|
if (! (z <= zero)) FAILURE ("<=", "greater")
|
if (! (z <= one)) FAILURE ("<=", "greater")
|
if (! (z <= one)) FAILURE ("<=", "greater")
|
|
|
/* Less than: comparisons against equal values. */
|
/* Less than: comparisons against equal values. */
|
|
|
if (x < one) FAILURE ("<", "equal")
|
if (x < one) FAILURE ("<", "equal")
|
if (y < zero) FAILURE ("<", "equal")
|
if (y < zero) FAILURE ("<", "equal")
|
if (z < m_one) FAILURE ("<", "equal")
|
if (z < m_one) FAILURE ("<", "equal")
|
|
|
/* Less than: comparisons against lesser values. */
|
/* Less than: comparisons against lesser values. */
|
|
|
if (x < m_one) FAILURE ("<", "lesser")
|
if (x < m_one) FAILURE ("<", "lesser")
|
if (x < zero) FAILURE ("<", "lesser")
|
if (x < zero) FAILURE ("<", "lesser")
|
if (y < m_one) FAILURE ("<", "lesser")
|
if (y < m_one) FAILURE ("<", "lesser")
|
if (z < m_two) FAILURE ("<", "lesser")
|
if (z < m_two) FAILURE ("<", "lesser")
|
|
|
/* Less than: comparisons against greater values. */
|
/* Less than: comparisons against greater values. */
|
|
|
if (! (x < two)) FAILURE ("<", "greater")
|
if (! (x < two)) FAILURE ("<", "greater")
|
if (! (y < one)) FAILURE ("<", "greater")
|
if (! (y < one)) FAILURE ("<", "greater")
|
if (! (z < zero)) FAILURE ("<", "greater")
|
if (! (z < zero)) FAILURE ("<", "greater")
|
if (! (z < one)) FAILURE ("<", "greater")
|
if (! (z < one)) FAILURE ("<", "greater")
|
|
|
/* Greater than or equal to: comparisons against equal values. */
|
/* Greater than or equal to: comparisons against equal values. */
|
|
|
if (! (x >= one)) FAILURE (">=", "equal")
|
if (! (x >= one)) FAILURE (">=", "equal")
|
if (! (y >= zero)) FAILURE (">=", "equal")
|
if (! (y >= zero)) FAILURE (">=", "equal")
|
if (! (z >= m_one)) FAILURE (">=", "equal")
|
if (! (z >= m_one)) FAILURE (">=", "equal")
|
|
|
/* Greater than or equal to: comparisons against lesser values. */
|
/* Greater than or equal to: comparisons against lesser values. */
|
|
|
if (! (x >= m_one)) FAILURE (">=", "lesser")
|
if (! (x >= m_one)) FAILURE (">=", "lesser")
|
if (! (x >= zero)) FAILURE (">=", "lesser")
|
if (! (x >= zero)) FAILURE (">=", "lesser")
|
if (! (y >= m_one)) FAILURE (">=", "lesser")
|
if (! (y >= m_one)) FAILURE (">=", "lesser")
|
if (! (z >= m_two)) FAILURE (">=", "lesser")
|
if (! (z >= m_two)) FAILURE (">=", "lesser")
|
|
|
/* Greater than or equal to: comparisons against greater values. */
|
/* Greater than or equal to: comparisons against greater values. */
|
|
|
if (x >= two) FAILURE (">=", "greater")
|
if (x >= two) FAILURE (">=", "greater")
|
if (y >= one) FAILURE (">=", "greater")
|
if (y >= one) FAILURE (">=", "greater")
|
if (z >= zero) FAILURE (">=", "greater")
|
if (z >= zero) FAILURE (">=", "greater")
|
if (z >= one) FAILURE (">=", "greater")
|
if (z >= one) FAILURE (">=", "greater")
|
|
|
/* Greater than: comparisons against equal values. */
|
/* Greater than: comparisons against equal values. */
|
|
|
if (x > one) FAILURE (">", "equal")
|
if (x > one) FAILURE (">", "equal")
|
if (y > zero) FAILURE (">", "equal")
|
if (y > zero) FAILURE (">", "equal")
|
if (z > m_one) FAILURE (">", "equal")
|
if (z > m_one) FAILURE (">", "equal")
|
|
|
/* Greater than: comparisons against lesser values. */
|
/* Greater than: comparisons against lesser values. */
|
|
|
if (! (x > m_one)) FAILURE (">", "lesser")
|
if (! (x > m_one)) FAILURE (">", "lesser")
|
if (! (x > zero)) FAILURE (">", "lesser")
|
if (! (x > zero)) FAILURE (">", "lesser")
|
if (! (y > m_one)) FAILURE (">", "lesser")
|
if (! (y > m_one)) FAILURE (">", "lesser")
|
if (! (z > m_two)) FAILURE (">", "lesser")
|
if (! (z > m_two)) FAILURE (">", "lesser")
|
|
|
/* Greater than: comparisons against greater values. */
|
/* Greater than: comparisons against greater values. */
|
|
|
if (x > two) FAILURE (">", "greater")
|
if (x > two) FAILURE (">", "greater")
|
if (y > one) FAILURE (">", "greater")
|
if (y > one) FAILURE (">", "greater")
|
if (z > zero) FAILURE (">", "greater")
|
if (z > zero) FAILURE (">", "greater")
|
if (z > one) FAILURE (">", "greater")
|
if (z > one) FAILURE (">", "greater")
|
|
|
if (failcnt)
|
if (failcnt)
|
abort ();
|
abort ();
|
}
|
}
|
|
|