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 8int main () { exit (0); } 9#else 10 11union uf 12{ 13 unsigned int u; 14 float f; 15}; 16 17static float 18u2f (unsigned int v) 19{ 20 union uf u; 21 u.u = v; 22 return u.f; 23} 24 25static unsigned int 26f2u (float v) 27{ 28 union uf u; 29 u.f = v; 30 return u.u; 31} 32 33int ok = 1; 34 35static void 36tstmul (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. */ 49struct 50{ 51 unsigned int p1, p2, res; 52} expected[] = 53 { 54 {0xfff, 0x3f800400, 0xfff}, 55 {0xf, 0x3fc88888, 0x17}, 56 {0xf, 0x3f844444, 0xf} 57 }; 58 59int 60main (int argc, char *argv[], char *envp[]) 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