Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister

String comparison of numbers

by dsb (Chaplain)
on Mar 09, 2006 at 15:08 UTC ( #535405=perlquestion: print w/replies, xml ) Need Help??
dsb has asked for the wisdom of the Perl Monks concerning the following question:

This issue came up because I was setting some values using the rand() function, then requesting them through a SOAP request where the were received as strings. A numeric comparison between two numers that were seemingly the same failed:
# these two variables are indentical when printed to STDOUT $var1 = rand(1); $var2 = $soapres->dataof('//path/to/elem/')->attr->{attr}; if ( $var1 == $var2 ) { print "all is well\n"; } else { print "got problems?\n"; }
The comparison invariably failed. However, when I did a string comparison, it succeeded.
# these two variables are indentical when printed to STDOUT $var1 = rand(1); $var2 = $soapres->dataof('//path/to/elem/')->attr->{attr}; if ( $var1 eq $var2 ) { print "all is well\n"; } else { print "got problems?\n"; }
I'm guessing that this has something to do with the internal representation of the value returned by rand(). I'm guessing that the value is stored internally with a greater precision, so the numeric comparison between that value and the "truncated" value fails.

Of course...this is just my theory.

This @ISA my( $cool ) %SIG

Replies are listed 'Best First'.
Re: String comparison of numbers
by philcrow (Priest) on Mar 09, 2006 at 15:21 UTC
    When comparing floating point numbers, you should either round them both to the same precision and compare or subtract one from the other and see if the abs of the result is small:
    if ( abs( $number1 - $number2 ) < $something_tiny ) { print "all is well.\n"; }
    Numerical analysts usually prefer the latter many programmers prefer the former.


      Well, the two arguements need to be exactly identical. So, if that means using a truncated version of the rand() value, then that's what I'll do. I'm more curious as to if my theory is correct.

      This @ISA my( $cool ) %SIG

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://535405]
Approved by Corion
[Corion]: marto: How's things? I hope the kids are fine and you too!
[Corion]: Oh yay. I wonder why a very simple change in a program doesn't elicit a diff, and now I see that my diff program seems to have a bug ;)
[1nickt]: marto thanks for asking, so far so good. A pretty modern stack and decent procedures, although rather too much home-built stuff (e.g. a logging role that should tries to duplicate Log::Any).
[Corion]: No. It's just that I'm comparing the same output file twice, instead of comparing the output files of the two runs %-)
[Corion]: Lo and behold, running a program with the correct input files yields the correct (and expected) output. Yay me.
[1nickt]: Got a MacBook and am expected to develop directly on it, ironic given the recent thread about that.
[marto]: Corion, some not too serious issues with the kids, hopefully, other than that just dealing with commuting by car again in the winter, not much fun so far, and there's no real 'bad' weather yet :)

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (5)
As of 2017-12-11 11:39 GMT
Find Nodes?
    Voting Booth?
    What programming language do you hate the most?

    Results (289 votes). Check out past polls.