Answered by:
Calculations in floating point comparison
Question

I have encountered the issue a couple of times now, and wondered if it is a deliberate implementation "feature":
When comparing floating points and doing an inline calculation in the comparison, the outcome is very unpredicatable (yet luckily consistent ... ).
For example the comparison between 3 and 10 * 0.3; the outcome should obviously be false since the result is equal:
3 < 10F * 3
true
3 < 10 * 3F
true
3 < 10F * 0.3F
true
3 < 0.3F * 10
true
3 < 0.3 * 10F
false
3 < 0.3F * 10F
true
3 < 10 * 0.3
false
float result = 10 * 0.3F;
3 < result
false
What is the logic behind this?
// Rasmus
Answers

It is the same kind of logic that's in your desktop calculator. Type 1 / 3 = * 3 =. Why doesn't it produce "1"? Use the System.Decimal type if you want to reproduce the same kind of calculation errors as your desktop calculator. The float type cannot represent decimal fractions accurately, only binary fractions.
Hans Passant. Marked as answer by ZhiXin Ye Tuesday, November 18, 2008 1:58 PM

Read Jon Skeet's article on how floatingpoint arithmetic works:
http://www.yoda.arachsys.com/csharp/floatingpoint.html Marked as answer by ZhiXin Ye Tuesday, November 18, 2008 1:58 PM
All replies

It is the same kind of logic that's in your desktop calculator. Type 1 / 3 = * 3 =. Why doesn't it produce "1"? Use the System.Decimal type if you want to reproduce the same kind of calculation errors as your desktop calculator. The float type cannot represent decimal fractions accurately, only binary fractions.
Hans Passant. Marked as answer by ZhiXin Ye Tuesday, November 18, 2008 1:58 PM

Read Jon Skeet's article on how floatingpoint arithmetic works:
http://www.yoda.arachsys.com/csharp/floatingpoint.html Marked as answer by ZhiXin Ye Tuesday, November 18, 2008 1:58 PM