https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96799
Bug ID: 96799 Summary: C and Ada frontends have a different interpretation of double constants Product: gcc Version: 10.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: ada Assignee: unassigned at gcc dot gnu.org Reporter: demoonlit at panathenaia dot halfmoon.jp Target Milestone: --- Hello. Each of the C and Ada frontends has a different interpretation of the some kind of double constants. Reproducing: Write the same small double constants for each language. double1.c -------- const double d_min = 0x0.3ffffffffffffeP-1072; -------- double2.ads -------- package double2 is d_min : constant Long_Float := 16#0.3ffffffffffffe#e-268; end double2; -------- (Note: These constants are the hexadecimal of __DBL_DENORM_MIN__ and wanted to be rounded to the minimal value of double. The precise value is 0x0.4P-1072, but __DBL_DENORM_MIN__ is a written as decimal, so these constants are got from it by the conversion. This value is unimportant because perhaps this bug can be reproduced with other values.) Compile them. $ gcc -W -Wall -S double1.c $ gcc -W -Wall -S double2.ads double2.ads:2:35: warning: floating-point value underflows to 0.0 Ada frontend reports the underflow. C frontend does not. And compare double1.s and double2.s. double1.s -------- .text .globl _d_min .const .align 3 _d_min: .long 1 # <- It has been rounded. .long 0 .ident "GCC: (GNU) 10.1.0" .subsections_via_symbols -------- double2.s -------- .text .globl _double2_E .data .align 1 _double2_E: .space 2 .globl _double2__d_min .const .align 3 _double2__d_min: .space 8 # <- It has been truncated. .ident "GCC: (GNU) 10.1.0" .subsections_via_symbols -------- I first noticed it in the FreeBSD 32bit. FreeBSD 32bit has the lesser precision of long double than other environments. However, then I tried it in FreeBSD 64bit, Linux, and MacOSX and it is reproducible too.