<div dir="ltr"><br><br>On Sun, Jan 24, 2021 at 5:06 PM ming han <<a href="mailto:dustming@gmail.com">dustming@gmail.com</a>> wrote:<br>><br>> Hi Everyone <br>><br><div>>    Many thanks for your help. Is if(fabs(map_A - map_B) <= 1.0e-15, ... ) approach may increase the runtime compare to '==' way? <br></div><div><br></div><div>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.</div><div><br></div><div>Markus M<br></div>><br>> Thanks<br>> Ming <br>><br>> Markus Metz <<a href="mailto:markus.metz.giswork@gmail.com">markus.metz.giswork@gmail.com</a>> 于2021年1月24日周日 上午10:57写道:<br>>><br>>> 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)" ?<br>>><br>>> 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.<br>>><br>>> 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.<br>>><br>>> 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.<br>>><br>>> Markus M<br>>><br>>><br>>> On Sun, Jan 24, 2021 at 3:51 PM ming han <<a href="mailto:dustming@gmail.com">dustming@gmail.com</a>> wrote:<br>>> ><br>>> > Hi Markus and Micha<br>>> ><br>>> >      I am just trying to find grids have the same values in these two rasters, I will try the threshold approach.<br>>> ><br>>> > Thanks<br>>> > Ming<br>>> ><br>>> > Markus Neteler <<a href="mailto:neteler@osgeo.org">neteler@osgeo.org</a>> 于2021年1月24日周日 上午6:58写道:<br>>> >><br>>> >> Hi Ming,<br>>> >><br>>> >> On Sun, Jan 24, 2021 at 10:49 AM ming han <<a href="mailto:dustming@gmail.com">dustming@gmail.com</a>> wrote:<br>>> >> ><br>>> >> > Hi Micha<br>>> >> ><br>>> >> >      Many thanks for your reply.<br>>> >> >      Here is the command I am using:<br>>> >> ><br>>> >> >      if(float(cat1_acc_riv) == float(cat1_minacc), str_r, null())<br>>> >> ><br>>> >> >       The str_r is a CELL raster. the result is different when I change it to:<br>>> >> >        if(int(cat1_acc_riv) == int(cat1_minacc), str_r, null())<br>>> >><br>>> >> Note that numerical "equality" is better tested with a threshold test<br>>> >> against the map pixel difference.<br>>> >> As the threshold, we use GRASS_EPSILON which is defined as 1.0e-15.<br>>> >><br>>> >> Hence the test needs to be implemented in a different way, i.e. by<br>>> >> using an epsilon.<br>>> >> Essentially something like this:<br>>> >><br>>> >> if(fabs(map_A - map_B) <= 1.0e-15, ... )<br>>> >><br>>> >> In your case (untested):<br>>> >> r.mapcalc diffepsilon = if( abs( map_A - map_B) <= 1.0e-15, str_r , null())<br>>> >><br>>> >> See related discussions here: [1], [2] and elsewhere.<br>>> >><br>>> >> [1] Comment by Glynn: <a href="https://trac.osgeo.org/grass/ticket/2854#comment:9">https://trac.osgeo.org/grass/ticket/2854#comment:9</a><br>>> >> [2] Comment by Glynn:<br>>> >> <a href="https://lists.osgeo.org/pipermail/grass-user/2015-October/073200.html">https://lists.osgeo.org/pipermail/grass-user/2015-October/073200.html</a><br>>> >><br>>> >> Best,<br>>> >> Markus<br>>> ><br>>> > _______________________________________________<br>>> > grass-dev mailing list<br>>> > <a href="mailto:grass-dev@lists.osgeo.org">grass-dev@lists.osgeo.org</a><br>>> > <a href="https://lists.osgeo.org/mailman/listinfo/grass-dev">https://lists.osgeo.org/mailman/listinfo/grass-dev</a></div>