https://gcc.gnu.org/bugzilla/show_bug.cgi?id=39878

--- Comment #2 from Fred J. Tydeman <tydeman at tybor dot com> ---
With gcc 15.1.1, the same problem still exists.

/*
 * Compiler converts some decimal FP constants wrong.

 CFLAGS="-H -std=gnu23 -O0 -march=native -mhard-float -mfpmath=387 -mieee-fp \
 -enable-decimal-float=yes \
 -fexcess-precision=standard \
 -ffloat-store \
 -ffp-contract=off \
 -fmath-errno \
 -fno-associative-math \
 -fno-builtin \
 -fno-cx-limited-range \
 -fno-fast-math \
 -fno-finite-math-only \
 -fno-reciprocal-math \
 -fno-unsafe-math-optimizations \
 -frounding-math \
 -fsignaling-nans \
 -fsigned-zeros \
 -ftrapping-math \
 ${INCS} \
 -I/usr/include/dfp"

*/
#define __STDC_WANT_DEC_FP__
#include <assert.h>
int main(void){
  {
    _Decimal32 fp32 =
+5.0000000000000000000000000000000000000000000000000000001e-102DF;
    assert(fp32 == +1.0000000e-101DF);
  }
  {
    _Decimal32 fp32 =
+.000000000000000000000099999949999999999999999999999999999e-73DF;
    assert(fp32 == +9.9999900e-96DF);
  }
  {
    _Decimal32 fp32 =
+09999998.50000000000000000000000000000000000000000000000000001DF;
    assert(fp32 == +9.9999990e+06DF);
  }
  {
    _Decimal32 fp32 =
+09999999.49999999999999999999999999999999999999999999999999999DF;
    assert(fp32 == +9.9999990e+06DF);
  }
  {
    _Decimal32 fp32 =
+10000005.00000000000000000000000000000000000000000000000000001DF;
    assert(fp32 == +1000001.DF);
  }
  {
    _Decimal32 fp32 =
+10000014.99999999999999999999999999999999999999999999999999999DF;
    assert(fp32 == +1000001.DF);
  }
  {
    _Decimal32 fp32 =
+9999999499999999999999999999.999999799999999999999999999999e69DF;
    assert(fp32 == +9.9999990e+96DF);
  }
  {
    _Decimal64 fp64 =
+5.0000000000000000000000000000000000000000000000000000001e-399DD;
    assert(fp64 == +1.0000000000000000e-398DD);
  }
  {
    _Decimal64 fp64 =
+.00000000000000000000099999999999999949999999999999999999e-362DD;
    assert(fp64 == +9.9999999999999900e-384DD);
  }
  {
    _Decimal64 fp64 =
+09999999999999998.50000000000000000000000000000000000000000001DD;
    assert(fp64 == +9.9999999999999990e+15DD);
  }
  {
    _Decimal64 fp64 =
+09999999999999999.49999999999999999999999999999999999999999999DD;
    assert(fp64 == +9.9999999999999990e+15DD);
  }
  {
    _Decimal64 fp64 =
+10000000000000005.00000000000000000000000000000000000000000001DD;
    assert(fp64 == +1.0000000000000010e+16DD);
  }
  {
    _Decimal64 fp64 =
+9999999999999999499999999999.99999999999999999999999999999e357DD;
    assert(fp64 == +9.9999999999999990e+384DD);
  }
  return 0;
}

Reply via email to