1 /* Check that certain subnormal numbers (formerly known as denormalized
2 numbers) are rounded to within 0.5 ulp. PR other/14354. */
3
4 /* This test requires that float and unsigned int are the same size and
5 that the sign-bit of the float is at MSB of the unsigned int. */
6
7 #if __INT_MAX__ != 2147483647L
main()8 int main () { exit (0); }
9 #else
10
11 union uf
12 {
13 unsigned int u;
14 float f;
15 };
16
17 static float
u2f(unsigned int v)18 u2f (unsigned int v)
19 {
20 union uf u;
21 u.u = v;
22 return u.f;
23 }
24
25 static unsigned int
f2u(float v)26 f2u (float v)
27 {
28 union uf u;
29 u.f = v;
30 return u.u;
31 }
32
33 int ok = 1;
34
35 static void
tstmul(unsigned int ux,unsigned int uy,unsigned int ur)36 tstmul (unsigned int ux, unsigned int uy, unsigned int ur)
37 {
38 float x = u2f (ux);
39 float y = u2f (uy);
40
41 if (f2u (x * y) != ur)
42 /* Set a variable rather than aborting here, to simplify tracing when
43 several computations are wrong. */
44 ok = 0;
45 }
46
47 /* We don't want to make this const and static, or else we risk inlining
48 causing the test to fold as constants at compile-time. */
49 struct
50 {
51 unsigned int p1, p2, res;
52 } expected[] =
53 {
54 {0xfff, 0x3f800400, 0xfff},
55 {0xf, 0x3fc88888, 0x17},
56 {0xf, 0x3f844444, 0xf}
57 };
58
59 int
main()60 main ()
61 {
62 unsigned int i;
63
64 for (i = 0; i < sizeof (expected) / sizeof (expected[0]); i++)
65 {
66 tstmul (expected[i].p1, expected[i].p2, expected[i].res);
67 tstmul (expected[i].p2, expected[i].p1, expected[i].res);
68 }
69
70 if (!ok)
71 abort ();
72
73 exit (0);
74 }
75 #endif
76