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

--- Comment #9 from rguenther at suse dot de <rguenther at suse dot de> ---
On Tue, 5 Sep 2017, jakub at gcc dot gnu.org wrote:

> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82004
> 
> Jakub Jelinek <jakub at gcc dot gnu.org> changed:
> 
>            What    |Removed                     |Added
> ----------------------------------------------------------------------------
>                  CC|                            |jakub at gcc dot gnu.org
> 
> --- Comment #8 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
> (In reply to Thomas Koenig from comment #7)
> > (In reply to Richard Biener from comment #6)
> > 
> > > I suppose reporting this to SPEC folks and requesting a chlcnc table
> > > change to .009999_r8 isn't going to fly ;)
> > 
> > I think reporting this to be a good idea.
> > 
> > All the SPEC people should have read "What Every Computer Scientist
> > Should Know About Floating-Point Arithmetic", right? :-)
> 
> They often don't care though, something that happened e.g. with out of bound
> array accesses in SPEC2k6.  But maybe they will when SPEC2k17 is new.

Note in this case we have some really weird code anyway:

   integer (int_kind), parameter :: &
      nsub = 400,  &! total number chlorophyll concentrations in look up 
table
      ksol = 2*km, &! (0:ksol) transmission levels (layer interface + 
mid-point)
      nchl = 31     ! number of chlorophyll absorption coefficients

...
   real (r8), parameter, dimension(nchl) :: &!chl for table look-up
     chlcnc = (/                            &
     .001_r8, .005_r8, .01_r8,  .02_r8,     &
     .03_r8,  .05_r8,  .10_r8,  .15_r8,     &
     .20_r8,  .25_r8,  .30_r8,  .35_r8,     &
     .40_r8,  .45_r8,  .50_r8,  .60_r8,     &
     .70_r8,  .80_r8,  .90_r8, 1.00_r8,     &
     1.50_r8, 2.00_r8, 2.50_r8, 3.00_r8,    &
     4.00_r8, 5.00_r8, 6.00_r8, 7.00_r8,    &
     8.00_r8, 9.00_r8,10.00_r8  /)

...
   chlmin  = chlcnc(1)
   chlmax  = chlcnc(nchl)
   dlogchl = (log10(chlmax)-log10(chlmin))/real(nsub)
...
   logchl = log10(chlmin) - dlogchl
   do n=0,nsub
     logchl = logchl + dlogchl
     chlamnt = 10**(logchl)
     do m=1,nchl-1
       if (chlcnc(m) .le. chlamnt .and. &
           chlamnt .le. chlcnc(m+1) ) then
      mc = m

so we start with 10**-3.  We'll eventually even see that in PRE
but likely exactly evaluate the starting FP constant.

What is fishy here is that the code compares

chlcnc(m) <= chlamnt && chlamnt <= chlcnc(m+1)

that is, both <=.  This is likely _just_ to make the first entry
match.  And the code relies on log10 and 10** exactly
cancelling for the .001_r8 entry.

So yes, I think a fix is warranted.

As a last resort we can always choose to not touch 10**x
but only transform it to exp10 when available (similar for
2**x and e**x -- I doubt log(e) computes 1 "exactly enough"
though I hope math.h has M_E and M_El that when fed to
mpfr log will compute 1.0).

Reply via email to