Re: [GRASS-user] compare a DCELL and FCELL question
Markus Metz <[email protected]> Sun, 24 Jan 2021 17:32:33 +0100
| Newsgroups | gmane.comp.gis.grass.devel,gmane.comp.gis.grass.user |
|---|---|
| Message-ID | <CAG+h=FGcfQ3_JAFUFhmpGOPs7x0MRFf4=LAQW0okmHrLpMi0_g@mail.gmail.com> |
--===============0622904447369889645== Content-Type: multipart/alternative; boundary="00000000000093e1d905b9a7f82e" --00000000000093e1d905b9a7f82e Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Sun, Jan 24, 2021 at 5:06 PM ming han <[email protected]> wrote: > > Hi Everyone > > Many thanks for your help. Is if(fabs(map_A - map_B) <=3D 1.0e-15, ...= ) approach may increase the runtime compare to '=3D=3D' 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 <[email protected]> =E4=BA=8E2021=E5=B9=B41=E6=9C= =8824=E6=97=A5=E5=91=A8=E6=97=A5 =E4=B8=8A=E5=8D=8810:57=E5=86=99=E9=81=93= =EF=BC=9A >> >> 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) =3D=3D float(cat1_minacc)" not equal to "int(cat1_acc_riv) =3D=3D int(cat1_minacc)= " ? >> >> int truncates to integer while float converts to single precision floating point. E.g. with cat1_acc_riv =3D 1.1 and cat1_minacc =3D 1.9, "float(cat1_acc_riv) =3D=3D float(cat1_minacc)" becomes "1.1 =3D=3D 1.9" wh= ereas "int(cat1_acc_riv) =3D=3D int(cat1_minacc)" becomes "1 =3D=3D 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) =3D= =3D double(cat1_minacc)" or even better the suggestion of Markus N. >> >> Markus M >> >> >> On Sun, Jan 24, 2021 at 3:51 PM ming han <[email protected]> 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 <[email protected]> =E4=BA=8E2021=E5=B9=B41=E6=9C=8824= =E6=97=A5=E5=91=A8=E6=97=A5 =E4=B8=8A=E5=8D=886:58=E5=86=99=E9=81=93=EF=BC= =9A >> >> >> >> Hi Ming, >> >> >> >> On Sun, Jan 24, 2021 at 10:49 AM ming han <[email protected]> wrote: >> >> > >> >> > Hi Micha >> >> > >> >> > Many thanks for your reply. >> >> > Here is the command I am using: >> >> > >> >> > if(float(cat1_acc_riv) =3D=3D 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) =3D=3D 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) <=3D 1.0e-15, ... ) >> >> >> >> In your case (untested): >> >> r.mapcalc diffepsilon =3D if( abs( map_A - map_B) <=3D 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 >> > [email protected] >> > https://lists.osgeo.org/mailman/listinfo/grass-dev --00000000000093e1d905b9a7f82e Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable <div dir=3D"ltr"><br><br>On Sun, Jan 24, 2021 at 5:06 PM ming han <<a hr= ef=3D"mailto:[email protected]">[email protected]</a>> wrote:<br>><= br>> Hi Everyone <br>><br><div>> =C2=A0 =C2=A0Many thanks for your= help. Is if(fabs(map_A - map_B) <=3D 1.0e-15, ... ) approach may increa= se the runtime compare to '=3D=3D' way? <br></div><div><br></div><d= iv>The formulas are very simple, I don't think that differences in runt= ime can be reliably measured. (De-)compression of the data and the operatin= g system's file cache have a much stronger influence on the runtime.</d= iv><div><br></div><div>Markus M<br></div>><br>> Thanks<br>> Ming <= br>><br>> Markus Metz <<a href=3D"mailto:markus.metz.giswork@gmail= .com">[email protected]</a>> =E4=BA=8E2021=E5=B9=B41=E6=9C= =8824=E6=97=A5=E5=91=A8=E6=97=A5 =E4=B8=8A=E5=8D=8810:57=E5=86=99=E9=81=93= =EF=BC=9A<br>>><br>>> Trying to answer the original question: w= ith a DCELL map "cat1_acc_riv" and a FCELL map "cat1_minacc&= quot;, why is "float(cat1_acc_riv) =3D=3D float(cat1_minacc)" not= equal to "int(cat1_acc_riv) =3D=3D int(cat1_minacc)" ?<br>>&g= t;<br>>> int truncates to integer while float converts to single prec= ision floating point. E.g. with cat1_acc_riv =3D 1.1 and cat1_minacc =3D 1.= 9, "float(cat1_acc_riv) =3D=3D float(cat1_minacc)" becomes "= 1.1 =3D=3D 1.9" whereas "int(cat1_acc_riv) =3D=3D int(cat1_minacc= )" becomes "1 =3D=3D 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 1943= 20560 but int(194320567) preserves the value 194320567.<br>>><br>>= > Thus the safest is to cast everything to the type with the highest pre= cision. In this case with FCELL and DCELL, use "double(cat1_acc_riv) = =3D=3D double(cat1_minacc)" or even better the suggestion of Markus N.= <br>>><br>>> Markus M<br>>><br>>><br>>> On Su= n, Jan 24, 2021 at 3:51 PM ming han <<a href=3D"mailto:[email protected]= m">[email protected]</a>> wrote:<br>>> ><br>>> > Hi M= arkus and Micha<br>>> ><br>>> > =C2=A0 =C2=A0 =C2=A0I am = just trying to find grids have the same values in these two rasters, I will= try the threshold approach.<br>>> ><br>>> > Thanks<br>&g= t;> > Ming<br>>> ><br>>> > Markus Neteler <<a hr= ef=3D"mailto:[email protected]">[email protected]</a>> =E4=BA=8E2021=E5= =B9=B41=E6=9C=8824=E6=97=A5=E5=91=A8=E6=97=A5 =E4=B8=8A=E5=8D=886:58=E5=86= =99=E9=81=93=EF=BC=9A<br>>> >><br>>> >> Hi Ming,<br= >>> >><br>>> >> On Sun, Jan 24, 2021 at 10:49 AM mi= ng han <<a href=3D"mailto:[email protected]">[email protected]</a>>= wrote:<br>>> >> ><br>>> >> > Hi Micha<br>>= ;> >> ><br>>> >> > =C2=A0 =C2=A0 =C2=A0Many than= ks for your reply.<br>>> >> > =C2=A0 =C2=A0 =C2=A0Here is th= e command I am using:<br>>> >> ><br>>> >> > = =C2=A0 =C2=A0 =C2=A0if(float(cat1_acc_riv) =3D=3D float(cat1_minacc), str_r= , null())<br>>> >> ><br>>> >> > =C2=A0 =C2=A0= =C2=A0 The str_r is a CELL raster. the result is different when I change i= t to:<br>>> >> > =C2=A0 =C2=A0 =C2=A0 =C2=A0if(int(cat1_acc_= riv) =3D=3D int(cat1_minacc), str_r, null())<br>>> >><br>>&g= t; >> 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 a= s 1.0e-15.<br>>> >><br>>> >> Hence the test needs t= o 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) <=3D 1.0e-15, ... )= <br>>> >><br>>> >> In your case (untested):<br>>= > >> r.mapcalc diffepsilon =3D if( abs( map_A - map_B) <=3D 1.0= e-15, str_r , null())<br>>> >><br>>> >> See related= discussions here: [1], [2] and elsewhere.<br>>> >><br>>>= >> [1] Comment by Glynn: <a href=3D"https://trac.osgeo.org/grass/tic= ket/2854#comment:9">https://trac.osgeo.org/grass/ticket/2854#comment:9</a><= br>>> >> [2] Comment by Glynn:<br>>> >> <a href=3D"= https://lists.osgeo.org/pipermail/grass-user/2015-October/073200.html">http= s://lists.osgeo.org/pipermail/grass-user/2015-October/073200.html</a><br>&g= t;> >><br>>> >> Best,<br>>> >> Markus<br>&= gt;> ><br>>> > _____________________________________________= __<br>>> > grass-dev mailing list<br>>> > <a href=3D"mail= to:[email protected]">[email protected]</a><br>>> >= ; <a href=3D"https://lists.osgeo.org/mailman/listinfo/grass-dev">https://li= sts.osgeo.org/mailman/listinfo/grass-dev</a></div> --00000000000093e1d905b9a7f82e-- --===============0622904447369889645== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ grass-dev mailing list [email protected] https://lists.osgeo.org/mailman/listinfo/grass-dev --===============0622904447369889645==--