views:

177

answers:

3

Hi all!

Imagine that a - b < c (a, b, c are C# doubles). Is it guaranteed that a < b + c?

Thanks!

EDIT
Let's say that the arithmetical overflow doesn't occur unlike the following example:

double a = 1L << 53;
double b = 1;
double c = a;

Console.WriteLine(a - b < c); // Prints True
Console.WriteLine(a < b + c); // Prints False

Imagine that Math.Abs(a) < 1.0 && Math.Abs(b) < 1.0 && Math.Abs(c) < 1.0

+13  A: 

No. Suppose a = c, a very large number, and b is a very small number. It's possible that a - b has a representation less than a, but a + b is so close to a (and bigger) that it still ends up being most precisely representable as a.

Here's an example:

double a = 1L << 53;
double b = 1;
double c = a;

Console.WriteLine(a - b < c); // Prints True
Console.WriteLine(a < b + c); // Prints False

EDIT:

Here's another example, which matches your edited question:

double a = 1.0;
double b = 1.0 / (1L << 53);
double c = a;

Console.WriteLine(a - b < c); // Prints True
Console.WriteLine(a < b + c); // Prints False

In other words, when we subtract a very small number from 1, we get a result less than 1. When we add the same number to 1, we just get 1 back due to the limitations of double precision.

Jon Skeet
+1, proof by a counter example. Love it.
Darin Dimitrov
or the other way around, I also have the feeling it's like that.
Thomas Wanner
It gets even weirder when `a=c=double.MaxValue`. Then both are false.
Vilx-
Great example, sure. But actually we deal with micro-numbers, not with values around double.MaxValue. Please read EDIT for more information.
levanovd
@levanovd: `1 << 53` is *way* smaller than double.MaxValue. There's no overflow going on here.
Jon Skeet
@levanovd: I've provided another example which fits into your limits.
Jon Skeet
Now I fully understand that, thank you!
levanovd
+6  A: 

no not always:

        double a = double.MaxValue;
        double b = double.MaxValue;
        double c = 0.1;
        Console.WriteLine(a - b < c); // True
        Console.WriteLine(a < b + c); // False
Tim Carter
+2  A: 

This link speaks about floating-point arithmetic properties, and could be very interesting:

FLOATING-POINT FALLACIES

In particular, search for Properties of Relations

digEmAll