http://www.perlmonks.org?node_id=1002376


in reply to Re: Weird excel parsing problem
in thread Weird excel parsing problem

Not always. I found a bug trying to deploy JSON::XS on AIX 7 where '5e1' was deciphered by JSON::XS, and came out to 50.0000000007 or something. On other platforms, it worked fine. And this was basically because there's a bug in AIX 7's libm where rounding happens wrong or something. So anyway, when comparing with ==, they failed to match, but comparing with eq made it work (because perl stringified the number to 50, due to a lower precision).

So what I'd do here is try to get more information about both $ray and each value and see if there's a mismatch at some higher precision, e.g., using sprintf "%.15f", $ray (and likewise for each value in the worksheet being compared against). That is for == failures. For eq failures, what I learned many many years ago was to put my debug in delimiters. I learned with [...], so something like this: print "ray = [$ray]\n" to see if there are spaces. Even better to use Data::Dumper or something else that will not only use delimiters (often quotes) but also look for non-printables and convert them (e.g., tabs, nuls, etc.).

Replies are listed 'Best First'.
Re^3: Weird excel parsing problem
by afoken (Chancellor) on Nov 06, 2012 at 05:43 UTC

      Except that, as you point out, we're referring to 5.0, and that is an exact number in binary, not like, say, 5.1. All of the numbers involved in that equation are representable exactly, even in floating point. On all platforms other than AIX7, 5e1 is deciphered to be 50, exactly. And IBM has a published bug report on this (they only publish bugs they accept and either have fixed or are planning to fix or acknowledge are bugs but cannot be fixed - rejected bug reports are not published). So I'm pretty confident it's an actual bug :-)

      But what you point out is true as a generality, which is why I was pointing out that == doesn't always work, depending on what you're comparing. Works best for pure integers, not so good in general for floating point (but if you have numbers that can be represented exactly, barring bugs like the above, it should work). So ++ for pointing out the part I should have made explicit as to why == doesn't always work.