modernc.org/cc@v1.0.1/testdata/gcc-6.3.0/gcc/testsuite/gcc.c-torture/execute/ieee/mul-subnormal-single-1.c (about)

     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