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
       8  int main () { exit (0); }
       9  #else
      10  
      11  union uf
      12  {
      13    unsigned int u;
      14    float f;
      15  };
      16  
      17  static float
      18  u2f (unsigned int v)
      19  {
      20    union uf u;
      21    u.u = v;
      22    return u.f;
      23  }
      24  
      25  static unsigned int
      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
      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
      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