Re: [GRASS-user] compare a DCELL and FCELL question

Markus Metz <[email protected]> Sun, 24 Jan 2021 16:56:56 +0100
Newsgroups gmane.comp.gis.grass.devel,gmane.comp.gis.grass.user
Message-ID <CAG+h=FEkeiib1uQqkbvTLP3o85dWMJfnb-HwH0nDoYe4MSpGUQ@mail.gmail.com>
--===============8846149919402266184==
Content-Type: multipart/alternative; boundary="0000000000002e618205b9a77933"

--0000000000002e618205b9a77933
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

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

--0000000000002e618205b9a77933
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div>Trying to answer the original question: with a DCELL =
map &quot;cat1_acc_riv&quot; and a FCELL map &quot;cat1_minacc&quot;, why i=
s &quot;float(cat1_acc_riv) =3D=3D float(cat1_minacc)&quot; not equal to &q=
uot;int(cat1_acc_riv) =3D=3D int(cat1_minacc)&quot; ?<br></div><div><br></d=
iv><div>int truncates to integer while float converts to single precision f=
loating point. E.g. with cat1_acc_riv =3D 1.1 and cat1_minacc =3D 1.9, &quo=
t;float(cat1_acc_riv) =3D=3D float(cat1_minacc)&quot; becomes &quot;1.1 =3D=
=3D 1.9&quot; whereas &quot;int(cat1_acc_riv) =3D=3D int(cat1_minacc)&quot;=
 becomes &quot;1 =3D=3D 1&quot;, thus the results are different.</div><div>=
<br></div><div>Another reason for possible differences is that float can on=
ly represent max 7 decimal digits. E.g. float(194320567) becomes 194320560 =
but int(194320567) preserves the value 194320567.</div><div><br></div><div>=
Thus the safest is to cast everything to the type with the highest precisio=
n. In this case with FCELL and DCELL, use &quot;double(cat1_acc_riv) =3D=3D=
 double(cat1_minacc)&quot; or even better the suggestion of Markus N.</div>=
<div><br></div><div>Markus M<br></div><div><br></div><div><br>On Sun, Jan 2=
4, 2021 at 3:51 PM ming han &lt;<a href=3D"mailto:[email protected]">dustm=
[email protected]</a>&gt; wrote:<br>&gt;<br>&gt; Hi Markus and Micha<br>&gt;<br=
>&gt; =C2=A0 =C2=A0 =C2=A0I am just trying to find grids have the same valu=
es in these two rasters, I will try the threshold approach.<br>&gt;<br>&gt;=
 Thanks<br>&gt; Ming <br>&gt;<br>&gt; Markus Neteler &lt;<a href=3D"mailto:=
[email protected]">[email protected]</a>&gt; =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>&gt;&gt;<br>&gt;&gt; Hi Ming,<br>&gt;&gt;<br>&gt;&gt; On Sun, =
Jan 24, 2021 at 10:49 AM ming han &lt;<a href=3D"mailto:[email protected]"=
>[email protected]</a>&gt; wrote:<br>&gt;&gt; &gt;<br>&gt;&gt; &gt; Hi Mic=
ha<br>&gt;&gt; &gt;<br>&gt;&gt; &gt; =C2=A0 =C2=A0 =C2=A0Many thanks for yo=
ur reply.<br>&gt;&gt; &gt; =C2=A0 =C2=A0 =C2=A0Here is the command I am usi=
ng:<br>&gt;&gt; &gt;<br>&gt;&gt; &gt; =C2=A0 =C2=A0 =C2=A0if(float(cat1_acc=
_riv) =3D=3D float(cat1_minacc), str_r, null())<br>&gt;&gt; &gt;<br>&gt;&gt=
; &gt; =C2=A0 =C2=A0 =C2=A0 The str_r is a CELL raster. the result is diffe=
rent when I change it to:<br>&gt;&gt; &gt; =C2=A0 =C2=A0 =C2=A0 =C2=A0if(in=
t(cat1_acc_riv) =3D=3D int(cat1_minacc), str_r, null())<br>&gt;&gt;<br>&gt;=
&gt; Note that numerical &quot;equality&quot; is better tested with a thres=
hold test<br>&gt;&gt; against the map pixel difference.<br>&gt;&gt; As the =
threshold, we use GRASS_EPSILON which is defined as 1.0e-15.<br>&gt;&gt;<br=
>&gt;&gt; Hence the test needs to be implemented in a different way, i.e. b=
y<br>&gt;&gt; using an epsilon.<br>&gt;&gt; Essentially something like this=
:<br>&gt;&gt;<br>&gt;&gt; if(fabs(map_A - map_B) &lt;=3D 1.0e-15, ... )<br>=
&gt;&gt;<br>&gt;&gt; In your case (untested):<br>&gt;&gt; r.mapcalc diffeps=
ilon =3D if( abs( map_A - map_B) &lt;=3D 1.0e-15, str_r , null())<br>&gt;&g=
t;<br>&gt;&gt; See related discussions here: [1], [2] and elsewhere.<br>&gt=
;&gt;<br>&gt;&gt; [1] Comment by Glynn: <a href=3D"https://trac.osgeo.org/g=
rass/ticket/2854#comment:9">https://trac.osgeo.org/grass/ticket/2854#commen=
t:9</a><br>&gt;&gt; [2] Comment by Glynn:<br>&gt;&gt; <a href=3D"https://li=
sts.osgeo.org/pipermail/grass-user/2015-October/073200.html">https://lists.=
osgeo.org/pipermail/grass-user/2015-October/073200.html</a><br>&gt;&gt;<br>=
&gt;&gt; Best,<br>&gt;&gt; Markus<br>&gt;<br>&gt; _________________________=
______________________<br>&gt; grass-dev mailing list<br>&gt; <a href=3D"ma=
ilto:[email protected]">[email protected]</a><br>&gt; <a hr=
ef=3D"https://lists.osgeo.org/mailman/listinfo/grass-dev">https://lists.osg=
eo.org/mailman/listinfo/grass-dev</a></div></div>

--0000000000002e618205b9a77933--

--===============8846149919402266184==
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

--===============8846149919402266184==--