A note about the usage of GRASS_EPSILON = 1.0e-15: The range of single precision floating point is about 1.4012984643e−45 to 3.4028234664e38 That means for large numbers, using GRASS_EPSILON will also detect floating point precision limits, not only meaningful differences. For small numbers, GRASS_EPSILON will not detect meaningful differences. GRASS_EPSILON could instead be modified with something like "max(abs(map_A), abs(map_B)) * 1.0e-15" to test for meaningful differences.
Markus M On Sun, Jan 24, 2021 at 5:32 PM Markus Metz <markus.metz.gisw...@gmail.com> wrote: > > > > On Sun, Jan 24, 2021 at 5:06 PM ming han <dustm...@gmail.com> wrote: > > > > Hi Everyone > > > > Many thanks for your help. Is if(fabs(map_A - map_B) <= 1.0e-15, ... ) approach may increase the runtime compare to '==' way? > > The formulas are very simple, I don't think that differences in runtime can be reliably measured. (De-)compression of the data and the operating system's file cache have a much stronger influence on the runtime. > > Markus M > > > > Thanks > > Ming > > > > Markus Metz <markus.metz.gisw...@gmail.com> 于2021年1月24日周日 上午10:57写道: > >> > >> Trying to answer the original question: with a DCELL map "cat1_acc_riv" and a FCELL map "cat1_minacc", why is "float(cat1_acc_riv) == float(cat1_minacc)" not equal to "int(cat1_acc_riv) == int(cat1_minacc)" ? > >> > >> int truncates to integer while float converts to single precision floating point. E.g. with cat1_acc_riv = 1.1 and cat1_minacc = 1.9, "float(cat1_acc_riv) == float(cat1_minacc)" becomes "1.1 == 1.9" whereas "int(cat1_acc_riv) == int(cat1_minacc)" becomes "1 == 1", thus the results are different. > >> > >> Another reason for possible differences is that float can only represent max 7 decimal digits. E.g. float(194320567) becomes 194320560 but int(194320567) preserves the value 194320567. > >> > >> Thus the safest is to cast everything to the type with the highest precision. In this case with FCELL and DCELL, use "double(cat1_acc_riv) == double(cat1_minacc)" or even better the suggestion of Markus N. > >> > >> Markus M > >> > >> > >> On Sun, Jan 24, 2021 at 3:51 PM ming han <dustm...@gmail.com> wrote: > >> > > >> > Hi Markus and Micha > >> > > >> > I am just trying to find grids have the same values in these two rasters, I will try the threshold approach. > >> > > >> > Thanks > >> > Ming > >> > > >> > Markus Neteler <nete...@osgeo.org> 于2021年1月24日周日 上午6:58写道: > >> >> > >> >> Hi Ming, > >> >> > >> >> On Sun, Jan 24, 2021 at 10:49 AM ming han <dustm...@gmail.com> wrote: > >> >> > > >> >> > Hi Micha > >> >> > > >> >> > Many thanks for your reply. > >> >> > Here is the command I am using: > >> >> > > >> >> > if(float(cat1_acc_riv) == float(cat1_minacc), str_r, null()) > >> >> > > >> >> > The str_r is a CELL raster. the result is different when I change it to: > >> >> > if(int(cat1_acc_riv) == int(cat1_minacc), str_r, null()) > >> >> > >> >> Note that numerical "equality" is better tested with a threshold test > >> >> against the map pixel difference. > >> >> As the threshold, we use GRASS_EPSILON which is defined as 1.0e-15. > >> >> > >> >> Hence the test needs to be implemented in a different way, i.e. by > >> >> using an epsilon. > >> >> Essentially something like this: > >> >> > >> >> if(fabs(map_A - map_B) <= 1.0e-15, ... ) > >> >> > >> >> In your case (untested): > >> >> r.mapcalc diffepsilon = if( abs( map_A - map_B) <= 1.0e-15, str_r , null()) > >> >> > >> >> See related discussions here: [1], [2] and elsewhere. > >> >> > >> >> [1] Comment by Glynn: https://trac.osgeo.org/grass/ticket/2854#comment:9 > >> >> [2] Comment by Glynn: > >> >> https://lists.osgeo.org/pipermail/grass-user/2015-October/073200.html > >> >> > >> >> Best, > >> >> Markus > >> > > >> > _______________________________________________ > >> > grass-dev mailing list > >> > grass-...@lists.osgeo.org > >> > https://lists.osgeo.org/mailman/listinfo/grass-dev
_______________________________________________ grass-user mailing list grass-user@lists.osgeo.org https://lists.osgeo.org/mailman/listinfo/grass-user