1/* Test IEEE +0/-0 rules */
2
3static double pzero = +0.0;
4static double nzero = -0.0;
5static double pinf  = +1.0 / 0.0;
6static double ninf  = -1.0 / 0.0;
7static double nan   =  0.0 / 0.0;
8
9void
10expect (double value, double expected)
11{
12  if (expected != expected)	/* expected value is Not a number */
13    {
14      if (value == value)	/* actual value is a number */
15	abort ();
16    }
17
18  else if (value != value)
19    abort ();			/* actual value is a NaN */
20
21  else if (memcmp ((void *)&value, (void *)&expected, sizeof (double)) != 0)
22    abort ();			/* values don't match */
23}
24
25main ()
26{
27  expect (pzero + pzero, pzero);
28  expect (pzero + nzero, pzero);
29  expect (nzero + pzero, pzero);
30  expect (nzero + nzero, nzero);
31
32  expect (pzero - pzero, pzero);
33  expect (pzero - nzero, pzero);
34  expect (nzero - pzero, nzero);
35  expect (nzero - nzero, pzero);
36
37  expect (pzero * pzero, pzero);
38  expect (pzero * nzero, nzero);
39  expect (nzero * pzero, nzero);
40  expect (nzero * nzero, pzero);
41
42  expect (+1.00 * pzero, pzero);
43  expect (-1.00 * pzero, nzero);
44  expect (+1.00 * nzero, nzero);
45  expect (-1.00 * nzero, pzero);
46
47#ifndef _TMS320C6700
48  /* C6X floating point division is implemented using reciprocals.  */
49  expect (pzero / pzero, nan);
50  expect (pzero / nzero, nan);
51  expect (nzero / pzero, nan);
52  expect (nzero / nzero, nan);
53
54  expect (+1.00 / pzero, pinf);
55  expect (-1.00 / pzero, ninf);
56  expect (+1.00 / nzero, ninf);
57  expect (-1.00 / nzero, pinf);
58#endif
59
60  exit (0);
61}
62