# floating point anomaly?

Rajesh Chandra
Ranch Hand
Posts: 55
Will this return true or false??
System.out.println(1.0 - 2.0/3.0 == 1.0/3.0);

mathematically its true but if you try working it out you'll get false.Can anyone give the reason behind it??
regs Rajesh

Ulf Dittmer
Rancher
Posts: 42968
73
Go back to the classics: What every computer scientist should know about floating-point arithmetic

Jeff Albertson
Ranch Hand
Posts: 1780
mathematics != floating point arithmetic

Rajesh Chandra
Ranch Hand
Posts: 55
Thanks to Ulf & Jeff .The link that was posted is too volumous.Do you know of any place wherin I can get the basics explained in a simple way.Anyway is there a way by which we can ascertain that the aritmetic will be different as in the above case?
Regs
Rajesh

Rob Spoor
Sheriff
Posts: 20659
64
In floating point arithmetic, most decimals are rounded - simply because it is impossible to define it in binary. Where arithmetic has problems with 1/3, floating point arithmetic has problems with many other numbers as well, like 1/10. In binary, this leads to a repetition similar to 1/3 or 1/9.

Therefore, in any programming language, floating point comparison should be one by checking if the difference is small enough:
Where EPSILON is a very small value - the smaller EPSILON is, the smaller the fault in comparison.
Ideally EPSILON would of course be 0.0, meaning f1 == f2, but as you've just read - you can't rely on that comparison.

Eric McIntyre
Greenhorn
Posts: 26
This is one of the more obscure things for a beginner to grasp and it seems like the Question is Asked Frequently....

Ulf Dittmer
Rancher
Posts: 42968
73
It sure is a FAQ. I've added an entry to the Java Beginners FAQ.

Eric McIntyre
Greenhorn
Posts: 26
You know, I didn't mean to seem lazy. I just now realized the FAQ section is a Wiki.

Ashu Sindhu
Greenhorn
Posts: 5