------- Additional Comments From jsm28 at gcc dot gnu dot org  2005-05-23 23:55 
-------
Here is the example requested on IRC showing that we don't get it right with
DECIMAL_DIG digits and IEEE quad long double.  Tested with current mainline on
sparc-sun-solaris2.10 as an example target where long double is IEEE quad. 
Different examples may be needed for 64-bit hosts where we use more than 160
bits (but still not enough).  DECIMAL_DIG is 36 for IEEE quad.

int
f (void)
{
  if (0.000000000000000000000000000000000691986517009071585211899336165210746L
      == 0x0.000000000000000000000000000397cecf54a352d2cf251cf4c2d40ap+0L)
    return 1;
}
/* Above decimal is
   0x3.97cecf54a352d2cf251cf4c2d40900000000000000000000000000000006cfd...p-112,
   which to within 0.5ulp (113-bit mantissa) should round up to above
   hex value.  Thus, there should be no warning with -O2 -Wall.  */

My reading of F.5#2 is that conversions of all numbers with DECIMAL_DIG
significant figures are meant to be correct, not just of those which arise from
converting a representable binary number to decimal (which we probably do get
right).  I don't think you'll get all conversions with DECIMAL_DIG digits right
without at least 226 bits internal precision, and proving that any specific
figure is enough would be hard.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21718

Reply via email to