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

             Bug #: 52434
           Summary: Insufficient number of digits in floating point
                    formatting
    Classification: Unclassified
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libfortran
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: j...@gcc.gnu.org


Currently when formatting floating point numbers (that is, edit descriptors F,
E, EN, ES, G) we first convert the internal value to decimal using snprintf
with a fixed amount of digits, currently 41/24 significant digits depending on
whether quad precision is available. Apart from this being a performance
problem (see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38199#c13 ), in some
cases more digits can be useful. E.g. dyadic fractions can be exactly
represented:

! See 
!  
http://www.exploringbinary.com/print-precision-of-dyadic-fractions-varies-by-language/
 
program dyadic
  implicit none
  real(8) :: d
  d = 0.0000000000000000000542101086242752217003726400434970855712890625_8* &
0.0000000000000000000542101086242752217003726400434970855712890625_8*&
0.0000000000000000000542101086242752217003726400434970855712890625_8*&
0.0000000000000000000542101086242752217003726400434970855712890625_8*&
0.0000000000000000000542101086242752217003726400434970855712890625_8*&
0.0000000000000000000542101086242752217003726400434970855712890625_8*&
0.0000000000000000000542101086242752217003726400434970855712890625_8*&
0.0000000000000000000542101086242752217003726400434970855712890625_8*&
0.0000000000000000000542101086242752217003726400434970855712890625_8*&
0.0000000000000000000542101086242752217003726400434970855712890625_8*&
0.0000000000000000000542101086242752217003726400434970855712890625_8*&
0.0000000000000000000542101086242752217003726400434970855712890625_8*&
0.0000000000000000000542101086242752217003726400434970855712890625_8*&
0.0000000000000000000542101086242752217003726400434970855712890625_8*&
0.0000000000000000000542101086242752217003726400434970855712890625_8*&
0.0000000000000000000542101086242752217003726400434970855712890625_8*&
0.00000000000000088817841970012523233890533447265625_8
  print '(F0.1074)', d

  d = 0.99999999999999988897769753748434595763683319091796875_8
  print '(F0.53)', d
end program dyadic

Currently this program outputs

.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004940656458412465441765687928682213723650600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
.99999999999999988897769753748434595763683000000000000

The exact output is:

0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625
0.99999999999999988897769753748434595763683319091796875

The solution is to both this problem and the performance issue in PR 38199#c13
is to figure out the correct number of digits needed before calling snprintf.

Reply via email to