Perl Monk, Perl Meditation PerlMonks

### Results depending on evaluation order

by fishy (Pilgrim)
 on Apr 23, 2014 at 16:30 UTC Need Help??
fishy has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks,

I was trying the code from Okay! What!?!?!?
```my \$value1 = 14.4;
print "value1 = \$value1\n";

my \$value2 = 10 + 14.4 - 10;
print "value2 = \$value2\n";

if ( \$value1 == \$value2 ) {
print "value 1 equals value 2\n";
} else {
print "value 1 does not equal value2\n";
}
Output:
```value1 = 14.4
value2 = 14.4
value 1 does not equal value2

and from My floating point comparison does not work. Why ?
```\$number = 1.80;
\$premium = \$number * ( 1 + 10/100 );
\$expected = 1.98;
print "Number 1 : \$premium \n";
print "Number 2 : \$expected \n";
print "Not" if \$expected != \$premium;
print "Equal !! ";
Output:
```Number 1 : 1.98
Number 2 : 1.98
NotEqual !!

when I came up with the following behavior (tested on Perl 5.10.1 and on 5.18.2):

Swapping operands on the first sample code:
```my \$value2 = 10 + 14.4 - 10;          # wrong evaluated
```my \$value2 =  14.4 + 10 - 10;         # wrong evaluated
```my \$value2 = 10 - 10 + 14.4;          # right evaluated

Using eval:
```my \$value2 = eval (10 + 14.4 - 10);   # right evaluated

Using eval on the second sample code:
```\$number = 1.80;
\$premium = eval (\$number * ( 1 + 10/100 ));
\$expected = 1.98;
print "Number 1 : \$premium \n";
print "Number 2 : \$expected \n";
print "Not" if \$expected != \$premium;
print "Equal !! ";
Output:
```Number 1 : 1.98
Number 2 : 1.98
Equal !!

So, I got odd results depending on the order of the operands and right results on evaluating.

How can that be?

Replies are listed 'Best First'.
Re: Results depending on evaluation order
by LanX (Bishop) on Apr 23, 2014 at 16:38 UTC
left to right evaluation:

10 - 10 + 14.4 = (10 - 10) + 14.4 = 0 + 14.4 = 14.4

I already explained that the mantissa needs to be shifted to loose precision.

Cheers Rolf

( addicted to the Perl Programming Language)

Interesting. Thanks Rolf!

What about eval? Why it got right evaluated?

eval expects a string, so the number is converted to a string, and the stringification rounds a tiny bit, so it accidentally produces the right result.

Re: Results depending on evaluation order
by InfiniteSilence (Curate) on Apr 23, 2014 at 18:47 UTC

There is a difference between what is represented and what is actually being stored,

```  DB<11> p sprintf("%.8f", \$expected);
1.98000000
1.98000000

DB<13>
When you subtract the two the difference is exposed:
```  DB<16> p (\$expected - \$premium)
-2.22044604925031e-16

But it is very small. Let's lop off the unnecessary information:

```  DB<13> \$pa = 1.98

DB<14> \$pb = 1.98

DB<15> p (\$pb == \$pb)
1
DB<17> p (\$pb - \$pa)
0
DB<18>
DB<22> \$exp = sprintf("%.8f", \$expected)

DB<24> p (\$pre - \$exp)
0

So you see if you set limits on what Perl stores you should get more accurate comparisons.

Celebrate Intellectual Diversity

Create A New User
Node Status?
node history
Node Type: perlquestion [id://1083387]
Approved by rnewsham
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (7)
As of 2018-06-22 17:36 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
Should cpanminus be part of the standard Perl release?

Results (124 votes). Check out past polls.

Notices?