modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/ieee/rbug.c (about)

     1  #if defined(__i386__) && defined(__FreeBSD__)
     2  #include <ieeefp.h>
     3  #endif
     4  
     5  double d (unsigned long long k)
     6  {
     7    double x;
     8  
     9    x = (double) k;
    10    return x;
    11  }
    12  
    13  float s (unsigned long long k)
    14  {
    15    float x;
    16  
    17    x = (float) k;
    18    return x;
    19  }
    20  
    21  main ()
    22  {
    23    unsigned long long int k;
    24    double x;
    25  
    26  #if defined(__i386__) && defined(__FreeBSD__)
    27    /* This test case assumes extended-precision, but FreeBSD defaults to
    28       double-precision.  Make it so.  */
    29    fpsetprec (FP_PE);
    30  #endif
    31  
    32    if (sizeof (double) >= 8)
    33      {
    34        k = 0x8693ba6d7d220401ULL;
    35        x = d (k);
    36        k = (unsigned long long) x;
    37        if (k != 0x8693ba6d7d220800ULL)
    38  	abort ();
    39      }
    40  
    41    k = 0x8234508000000001ULL;
    42    x = s (k);
    43    k = (unsigned long long) x;
    44  #ifdef __SPU__
    45    /* SPU float rounds towards zero.  */
    46    if (k != 0x8234500000000000ULL)
    47      abort ();
    48  #else
    49    if (k != 0x8234510000000000ULL)
    50      abort ();
    51  #endif
    52  
    53    exit (0);
    54  }
    55