<div dir="ltr">Thank you for explain it, Dave! It works!<div><br></div><div>Graziela.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Em qua, 6 de fev de 2019 às 17:14, Dave Allured - NOAA Affiliate <<a href="mailto:dave.allured@noaa.gov">dave.allured@noaa.gov</a>> escreveu:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">Graziela,<br><br>This is a normal issue with floating point numbers.  Decimal fractions can not be represented exactly in binary floating point, except for a small subset that are exact sums of negative powers of 2.  For example, 42.75 can be represented exactly, but 42.6 can not.  When reading decimal strings from text formats like CSV, NCL and other languages will generally select the nearest available floating point value.  Therefore, when working with assumed decimal numbers, you get small roundoff errors that need special treatment.  Please see this article:</div><div dir="ltr"><br></div><div dir="ltr"><a href="https://en.wikipedia.org/wiki/Floating-point_arithmetic#Representable_numbers,_conversion_and_rounding" target="_blank">https://en.wikipedia.org/wiki/Floating-point_arithmetic#Representable_numbers,_conversion_and_rounding</a><br></div><div dir="ltr"><br>NCL's default print function does not show all significant floating point digits.  To properly debug this, use sprintf to show all significant digits.  Single precision float requires at least 9 significant decimal digits to display all possible unique internal values.  Double precision requires at least 17 decimal digits to show all possible values uniquely.<br><br>    print (sprintf ("%27.17g", (/ a, b, c /) ))<br><br></div><div dir="ltr">The normal way to handle inexact comparisons is to set a small threshold based on the expected numeric range and precision, then use threshold comparisons rather than equality.  Threshold comparisons may be absolute or relative, and should be customized for each application.  Try this:<br></div><div dir="ltr"><br></div><div>    delta = 0.001</div><div>    test1 = -50.2</div><div>    b = ind ( abs (xlon1(0:29) - test1) .lt. delta )</div><div><br></div><div>Finally, single precision float is okay for one or two fractional digits, but is often not precise enough for geographic coordinates in many applications.  I recommend you upgrade to type double for all processing of lat/lon coordinates.  When reading CSV, use todouble rather than tofloat.  Also decrease the threshold value "delta"  in threshold comparisons.</div><div dir="ltr"><br></div><div dir="ltr">--Dave<br><br><br>On Wed, Feb 6, 2019 at 6:31 AM Graziela Luzia <<a href="mailto:grazi.luzia@gmail.com" target="_blank">grazi.luzia@gmail.com</a>> wrote:<br>><br>> Hello ncl-users.<br>><br>> I'm converting a csv file in netcdf and apparently my script, although not very efficient (I'm a begginer) was working fine. But for some points it dindn't write correctly. I've checked everything and I supose the problem is converting string to float, but I can't figure out how can I solve this problem.<br>><br>> I don't understand why it shows me a value like 42.6 but it is like it was 42.600002. It causes me trouble when I compare it with another variable equal to 42.6, it returns a false result. Also, it only happen to some values, like 42.6 (but not with 50.2) as you can see below.<br>><br>> I've tried to use decimalPlaces, but it results the same.<br>> I'd apreciate any information. Thanks in advance.<br>><br>> uname-a: Linux Tower2 4.15.0-45-generic #48~16.04.1-Ubuntu SMP Tue Jan 29 18:03:48 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux<br>><br>> Graziela.<br>><br>> ---<br>> lines = asciiread("resultado.csv",-1,"string")<br>> data = lines(1:) ; exclude line 0 header<br>><br>> ;xlon = decimalPlaces(tofloat(str_get_field(data,1,",")),1,True)<br>> xlon=tofloat(str_get_field(data,1,","))<br>><br>> xlon1 = new(600,"float",-999)<br>>    do i=0,599<br>>       xlon1(i)=xlon(i*8)+0.1<br>>    end do<br>><br>> print(xlon1(0:29))<br>><br>> a=xlon1(23)-xlon1(24)<br>> print(a)<br>><br>> b=ind(xlon1(0:29).eq.-50.2)<br>> c=ind(xlon1(0:29).eq.-42.6)<br>> print(b)<br>> print(c)<br>><br>> ----<br>> labren@Tower2:~/Documentos/Produto3$ ncl teste.ncl<br>>  Copyright (C) 1995-2015 - All Rights Reserved<br>>  University Corporation for Atmospheric Research<br>>  NCAR Command Language Version 6.3.0<br>>  The use of this software is governed by a License Agreement.<br>>  See <a href="http://www.ncl.ucar.edu/" target="_blank">http://www.ncl.ucar.edu/</a> for more details.<br>><br>> Variable: xlon1 (subsection)<br>> Type: float<br>> Total Size: 120 bytes<br>>             30 values<br>> Number of Dimensions: 1<br>> Dimensions and sizes: [30]<br>> Coordinates:<br>> Number Of Attributes: 1<br>>   _FillValue : -999<br>> (0) -50.2<br>> (1) -50.2<br>> (2) -50.2<br>> (3) -50.2<br>> (4) -50.2<br>> (5) -50.2<br>> (6) -50.2<br>> (7) -50.2<br>> (8) -50.2<br>> (9) -50.2<br>> (10) -50.2<br>> (11) -50.2<br>> (12) -50.2<br>> (13) -50.2<br>> (14) -50.2<br>> (15) -50.2<br>> (16) -50.2<br>> (17) -50.2<br>> (18) -50.2<br>> (19) -50.2<br>> (20) -50.2<br>> (21) -50.2<br>> (22) -50.2<br>> (23) -50.2<br>> (24) -42.6<br>> (25) -42.6<br>> (26) -42.6<br>> (27) -42.6<br>> (28) -42.6<br>> (29) -42.6<br>><br>> Variable: a<br>> Type: float<br>> Total Size: 4 bytes<br>>             1 values<br>> Number of Dimensions: 1<br>> Dimensions and sizes: [1]<br>> Coordinates:<br>> Number Of Attributes: 1<br>>   _FillValue : -999<br>> (0) -7.599998<br>><br>><br>> Variable: b<br>> Type: integer<br>> Total Size: 96 bytes<br>>             24 values<br>> Number of Dimensions: 1<br>> Dimensions and sizes: [24]<br>> Coordinates:<br>> (0) 0<br>> (1) 1<br>> (2) 2<br>> (3) 3<br>> (4) 4<br>> (5) 5<br>> (6) 6<br>> (7) 7<br>> (8) 8<br>> (9) 9<br>> (10) 10<br>> (11) 11<br>> (12) 12<br>> (13) 13<br>> (14) 14<br>> (15) 15<br>> (16) 16<br>> (17) 17<br>> (18) 18<br>> (19) 19<br>> (20) 20<br>> (21) 21<br>> (22) 22<br>> (23) 23<br>><br>> Variable: c<br>> Type: integer<br>> Total Size: 4 bytes<br>>             1 values<br>> Number of Dimensions: 1<br>> Dimensions and sizes: [1]<br>> Coordinates:<br>> Number Of Attributes: 1<br>>   _FillValue : -2147483647<br>> (0) -2147483647<br>><br>> My csv file contain values like this:<br>><br>> xlon,ylat,ano,mes,direcao,v1,v2,v3,v4<br>> -50.3,-30.4,2016,1,45,0,0.0020206556,0.0017961383<br>> -50.3,-30.4,2016,1,90,0.0002245173,0.0004490346,0.0049393803,0.0246969017<br>> -50.3,-30.4,2016,1,135,0.0011225864,0.0029187247,0.0114503817,0.0177368657<br>> -50.3,-30.4,2016,1,180,0,0.0017961383,0.0038167939,0.0141445891 (...)<br><br></div></div></div></div></div></div></div></div></div>
</blockquote></div>