[GRASS-dev] Re: [GRASS GIS] #1161: g.region and r.info decimal
issue when using grass python libs
GRASS GIS
trac at osgeo.org
Sun Oct 3 23:26:57 EDT 2010
#1161: g.region and r.info decimal issue when using grass python libs
-------------------------+--------------------------------------------------
Reporter: isaacullah | Owner: grass-dev@…
Type: defect | Status: closed
Priority: normal | Milestone: 6.4.1
Component: Python | Version: 6.4.0
Resolution: invalid | Keywords: g.region, precision
Platform: All | Cpu: All
-------------------------+--------------------------------------------------
Comment(by glynn):
Replying to [comment:13 cmbarton]:
> What I was thinking about was whether it is worth it or not to have an
option to do a string conversion of these within the python library
function so that the resulting dictionary has values that match the
results (also string) of g.region.
Those functions are intended for the situation where you want to actually
'''use''' the values (e.g. perform arithmetic on them, which you can't do
with strings).
If you want strings, you may as well just use
grass.parse_command('g.region', ...) etc. parse_command() parses key-value
output into a dictionary, but doesn't parse the values further unless
specifically instructed via the val_type argument.
> The place where it could be helpful is in in a case like we have--where
a Python script [using grass.region()] is being called and parsed by Java
and g.region is being called and parsed by Java. Maybe the Java equivalent
of the Python str() will also give the same answer or maybe it won't.
Why would the Java code be converting them to strings? Assuming that you
pass it strings via the command line, I would expect it to just convert
them to float/double. Any exact comparison is fragile, and an exact
comparison using strings even more so (e.g. 1.2 and 1.20 should compare
equal as floats but the strings "1.2" and "1.20" won't compare equal).
> This goes for other languages. I simply don't know--though we will run
some tests to see. Perhaps this is a rare enough case, that it isn't worth
the trouble to provide this option.
It isn't worth the trouble in any case. Code which performs equality
comparisons on coordinates should itself be fixed, rather than expecting
other code to be modified in order to satisfy its (incorrect) assumptions.
You should never perform equality comparisons on floats unless you
'''know''' that the values are exactly representable. Even then, you need
to be careful about optimisations such as -funsafe-math-optimizations (and
broken compilers; Borland C always performs such optimisations, with no
means to disable them).
You really shouldn't rely upon '''anything''' preserving floating-point
values exactly, not just conversions to/from decimal. E.g. even without
changing the WIND file, the values g.region gives for nsres/ewres can
change depending upon the compiler and compilation switches used. Code
which works fine on one architecture can break on a different
architecture, e.g. due to the 80-bit internal precision of x86, default
rounding mode, etc.
--
Ticket URL: <http://trac.osgeo.org/grass/ticket/1161#comment:14>
GRASS GIS <http://grass.osgeo.org>
More information about the grass-dev
mailing list