World: r3wp
[!REBOL3-OLD1]
older newer | first last |
Ladislav 7-Jul-2009 [16144x4] | hi, renaming the EQUIVALENT? function to EQUIV? - Carl's wish |
(the original name was probably too long) | |
anybody knowing how to rename the http://www.rebol.net/wiki/EQUIVALENT%3F_tests page? | |
OK, just found out how to do it, sorry for bothering | |
Pekr 7-Jul-2009 [16148x2] | In CureCode ticket #870 Carl states: "Beginning in A68 PARSE/all is now the default when the rules are a block (not a simple string of delimiters). " - does it mean, that now parse is dependant upon the rules input? So when the input for rules is block, parse is switched to /all mode, while with string rule, it is not switched to /all? That will be confusing, no? |
I would discard non /all mode completly ... | |
Ladislav 7-Jul-2009 [16150] | put it to R3 chat, Carl may honor your request |
Pekr 7-Jul-2009 [16151] | posted to R3/Parse thread on R3 Chat ... |
BrianH 7-Jul-2009 [16152] | I suppose the name change was inevitible given that noone could come up with a decent operator to associate with the function. Hopefully people will expand the name to "equivalent" in their heads and it will have the same psychological effect - the length of the word was the reason for its choice in the first place. |
Geomol 7-Jul-2009 [16153] | Is this decimal problem also found in latest release? (I'm currently using older OS X version.) >> (to-decimal #{3fef ffff ffff ffff}) < to-decimal #{3ff0 0000 0000 0000} == false It's also a problem in sort: >> sort [1.0 0.9999999999999998] == [1.0 0.9999999999999998] |
Henrik 7-Jul-2009 [16154] | The first one is the same in A68 The second one is: >> sort [1.0 0.9999999999999998] == [1.0 1.0] |
Geomol 7-Jul-2009 [16155] | What about sort reduce [1.0 to-decimal #{3fef ffff ffff ffff}] |
Henrik 7-Jul-2009 [16156] | [1.0 1.0] |
BrianH 7-Jul-2009 [16157] | Try upping system/options/decimal-digits to 17. |
Henrik 7-Jul-2009 [16158] | noting that default is 15. |
BrianH 7-Jul-2009 [16159] | And the number of digits in your example is 16. |
Geomol 7-Jul-2009 [16160] | Setting it to 17 gives same wrong result here. |
Henrik 7-Jul-2009 [16161] | With 17: >> sort [1.0 0.9999999999999998] == [0.99999999999999978 1.0] |
Geomol 7-Jul-2009 [16162] | And what if you do: sort reduce [1.0 to-decimal #{3fef ffff ffff ffff}] |
Henrik 7-Jul-2009 [16163] | >> sort reduce [1.0 to-decimal #{3fef ffff ffff ffff}] == [0.99999999999999989 1.0] |
BrianH 7-Jul-2009 [16164] | >> sort reduce [1.0 to-decimal #{3fef ffff ffff ffff}] == [0.99999999999999989 1.0] |
Geomol 7-Jul-2009 [16165] | And setting it to 17 and trying: (to-decimal #{3fef ffff ffff ffff}) < to-decimal #{3ff0 0000 0000 0000} |
Henrik 7-Jul-2009 [16166] | still false for that one |
Geomol 7-Jul-2009 [16167] | ok. Do you guys know, if there's a CureCode ticket about it? |
BrianH 7-Jul-2009 [16168] | If you use <= you get true. It could be within the margin of error. |
Geomol 7-Jul-2009 [16169] | I'm wondering, if it could have consequences in other functions/mezzanines. |
BrianH 7-Jul-2009 [16170] | The decimal-digits option is only used for display. All other comparisons use 15 digits. |
Geomol 7-Jul-2009 [16171] | I think, decimals should be treated as binary data and converted to integers, when doing comparison and the like. |
BrianH 7-Jul-2009 [16172] | Wait for the proposed equivalency function changes in the next version. |
Geomol 7-Jul-2009 [16173] | Like: >> (to-integer #{3fef ffff ffff ffff}) < to-integer #{3ff0 0000 0000 0000} == true |
BrianH 7-Jul-2009 [16174x2] | Having a margin of error is standard operating procedure for IEEE754 floating point numbers, because anything over 15 digits are subject to rounding errors inherent in the encoding. |
That is why the 15-digit default. | |
Geomol 7-Jul-2009 [16176] | Maybe for equal, but I'm not sure with greater-than and less-than. |
BrianH 7-Jul-2009 [16177] | If you can't count on differences in the greater-than-15-digit range to be accurate, why should you consider them for comparisons? |
Geomol 7-Jul-2009 [16178x2] | Well, I see no reason, why this return false, no matter of precision: (to-decimal #{3fef ffff ffff ffff}) < to-decimal #{3ff0 0000 0000 0000} But maybe I need to think about it some more. |
It's like the decimal-digits have internal consequences, it shouldn't have. | |
BrianH 7-Jul-2009 [16180x4] | For instance: >> 0.3 < (0.1 + 0.1 + 0.1) == false >> 0.3 <= (0.1 + 0.1 + 0.1) == true Those values differ in the greater-than-15-digits range due to encoding errors. |
Those encoding errors are inherent in the IEEE754 format. The standard way to work around this is to not consider differences in the past-15-digits range. This is the case for all sorts of systems. | |
If you want exact comparisons, use money! ot integer! - decimal! is not appropriate. | |
Or you can wait for the next version, and have EQUIV?, ==, !== and =? do 17-digit comparisons, and the rest do the 15-digit comparisons that make values like 0.1 work. | |
Geomol 7-Jul-2009 [16184x2] | Maybe strict-lesser? is a needed function? ;-) |
(I need to think about it some more.) | |
BrianH 7-Jul-2009 [16186] | If you need to do exact comparisons with floating point numbers you need to use subtraction and comparison to 0.0 - it's the only way to be sure. Exact comparisons with floating point numbers have to take into account that the numbers themselves are not exact the vast majority of the time. |
Sunanda 9-Jul-2009 [16187] | A little sameness oddity for Ladislav. Two identical tuples can have different last elements :-) >> (to-tuple "1") = 1.0.0 == true >> (last to-tuple "1") = last 1.0.0 == false |
BrianH 9-Jul-2009 [16188] | That's an error in TO tuple!. |
Pekr 9-Jul-2009 [16189] | hmm, also first second last give strange results. First works, but others don't .... |
BrianH 9-Jul-2009 [16190] | Having trouble parsing that sentence - code? |
Pekr 9-Jul-2009 [16191] | Don't understand ... |
BrianH 9-Jul-2009 [16192] | Nevermind, I got it. I'm writing the ticket now. |
Pekr 9-Jul-2009 [16193] | Carl asked me to ask, what is general opinion to my suggestion - to remove parse /all refinement altogether. Current proposal is to swith parse by default to /all mode for block rules, and to recent default behaviour for string rule. As for myself I don't mind compatibility, so I prefer removing /all refinement and switching pase internally to /all mode .... |
older newer | first last |