[GRASS5] Re: [GRASS_DE] r.mapcalc round()

Glynn Clements glynn.clements at virgin.net
Tue May 15 23:36:16 EDT 2001


Markus Neteler wrote:

> > > > Does this go away if you compile r.univar with "-ffloat-store"?
> > > 
> > > Well, r.univar is only a script using r.stats and awk. However, after
> > > recompiling r.stats with above flag (adding 
> > > EXTRA_CFLAGS=-ffloat-store
> > > to the r.stats' Gmakefile) I can't see any difference.
> > 
> > That wouldn't help; it's the awk script which is doing the relevant
> > calculations. Looking at the awk script, I don't think that compiling
> > awk with -ffloat-store would help.
> > 
> > The problem is basically that none of the axioms of real arithmetic
> > quite hold true for floating-point arithmetic.
> > 
> > In this particular case, the variance is:
> > 
> > 	(SUM[x(i)^2] - SUM[x(i)]^2/N)/N
> > 
> > If all of the x(i)'s are identical, then the two sides of the
> > subtraction should be equal. However, given the error introduced by
> > each floating point operation, they will differ slightly; if the RHS
> > is slightly larger, then result will be negative, causing the sqrt()
> > to fail.
> > 
> > Whilst there probably is an algorithmic solution (a decent textbook on
> > numerical methods should list many approaches for working around the
> > problems inherent in floating-point subtraction), I'm not sure whether
> > that would be justified, or if it would be better to just include an
> > explicit check for a negative variance (indicating a variance so low
> > that it's been swamped by rounding error).
> 
> Perhaps I am wrong, but doesn't the problems in r.univar result from
> the input data?

No. Or at least this problem doesn't relate to wrong input data:

> Variance:  -2.49502e-12
> awk: cmd. line:17: (FILENAME=- FNR=18894) warning: sqrt called with negative argument -2.49502e-12
> Standarddeviation: nan

If all of the input values are identical (even if they're wrong), the
variance and SD should be zero. Also, whatever the inputs, the
variance should never be negative.

> If r.mapcalc produces wrong numbers, the r.univar shouldn't
> be better. Here, the r.univar replicates the values generated from
> r.mapcalc. So the problem may be in r.mapcalc.

The variance/SD problem is in one of the following, depending upon
your point of view:

a) the awk script "r.univar",
b) awk generally, or
c) floating-point arithmetic generally.

> The range results of r.mapcalc are quite strange with FP numbers.

Not that strange; with the "-1" flag, r.stats uses "%.10f" to print
the values; without it, it uses "%10f" then trims the result (this is
equivalent to "%.6f", at least for GNU libc).

> Even if I compile r.mapcalc with -ffloat-store the result is odd:

"-ffloat-store" was basically a hunch regarding the variance/SD issue,
which turned out to be incorrect. It will fix some FP problems
(specifically, when subtracting identical values doesn't give zero);
it won't fix all of them (in this case, subtracting values which
should be identical but aren't quite).

> r.mapcalc test=1.1
> CREATING SUPPORT FILES FOR test
> range: 1.1000000238 1.1000000238

This is to be expected; r.mapcalc also uses "%.10f", which is more
precision than a float has (float will be promoted to double when
passed as an unprototyped argument, as is the case with printf()).

-- 
Glynn Clements <glynn.clements at virgin.net>

---------------------------------------- 
If you want to unsubscribe from GRASS Development Team mailing list write to:
minordomo at geog.uni-hannover.de with
subject 'unsubscribe grass5'



More information about the grass-dev mailing list