https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95300
Bug ID: 95300 Summary: Decimal floating-point constants suffer double rounding Product: gcc Version: 9.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: tydeman at tybor dot com Target Milestone: --- The following code prints failures for 35 and 36 digit numbers. /* * Decimal floating-point constants suffer double rounding => get wrong value. * It appears that first the constant is convert to 34 digit _Decimal128 (1st rounding) * and then converted to _Decimal32 (2nd rounding). */ #define __STDC_WANT_IEC_60559_DFP_EXT__ 1 /* Tell implementation that we want Decimal FP */ #define __STDC_WANT_DEC_FP__ /* Tell implementation that we want Decimal FP */ #include <stdio.h> int main(void){ _Decimal32 d7, d33, d34, d35, d36; d7 = 1234567.DF; d33 = 1234567.49999999999999999999999999DF; d34 = 1234567.499999999999999999999999999DF; /* 1234567 89-123456789-123456789-123456789 */ d35 = 1234567.4999999999999999999999999999DF; d36 = 1234567.49999999999999999999999999999DF; if( d7 != d33 ) (void)printf("d33 bad\n"); if( d7 != d34 ) (void)printf("d34 bad\n"); if( d7 != d35 ) (void)printf("d35 bad\n"); if( d7 != d36 ) (void)printf("d36 bad\n"); return 0; }