<p dir="ltr">Thanks for the clear explanation Glynn. Maybe this behaviour could be esplicited inside the docs... </p>
<p dir="ltr">giovanni</p>
<div class="gmail_quote">Il 22/ott/2015 23:35, "Glynn Clements" <<a href="mailto:glynn@gclements.plus.com">glynn@gclements.plus.com</a>> ha scritto:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
G. Allegri wrote:<br>
<br>
> If logical operator is applied to, sat, Byte data it gives true/false<br>
> results, e.g. if(A && B,1, 0) behaves correctly even with cell values<br>
> values greater then 1.<br>
> That's why I expected it to work with floats operands too.<br>
> >From a user perspective if it works for a cell with value 2 it should also<br>
> work for a cell with value 2.0.<br>
> That'all.<br>
<br>
r.mapcalc's interpretation of booleans is borrowed from C. Booleans<br>
are just integers where zero is false and non-zero is true.<br>
<br>
But that doesn't necessarily make much sense for floats; the<br>
conventional wisdom is that comparing a float for equality with zero<br>
is usually a mistake, as results which should mathematically be equal<br>
to zero often aren't actually equal to zero due to intermediate<br>
rounding errors. In some cases, simply subtracting a number from<br>
itself won't yield zero (e.g. due to the x87 FPU using 80 bits for<br>
floating-point registers while values stored in memory use 32 or 64<br>
bits).<br>
<br>
You can obtain C-like behaviour by converting to an integer with the<br>
int() function then using that; the result is that any value between<br>
-1.0 and 1.0 (excluding both endpoints) will be considered false while<br>
anything else is true. Or you can convert to an integer with the<br>
round() function and use that, in which case any value between -0.5<br>
and 0.5 (including both endpoints) will be false while anything else<br>
is true. Or you can compare for equality with 0.0, in which case -0.0<br>
and 0.0 will be false while anything else is true. Or you can compare<br>
the magnitude (obtained using abs()) to an "epsilon" value so that<br>
anything smaller than the expsilon is false while anything larger is<br>
true.<br>
<br>
That's four different possibilities, none of which is any more<br>
"correct" than any of the others. Choosing one of them would just mean<br>
that r.mapcalc was probably using the "wrong" one, and doing so<br>
silently. The current behaviour forces the user to be explicit.<br>
<br>
--<br>
Glynn Clements <<a href="mailto:glynn@gclements.plus.com">glynn@gclements.plus.com</a>><br>
</blockquote></div>