I have 2 numbers, x and y, that are known and are represented exactly as floating point numbers. I want to know if z = x - y is always exact or if rounding errors can occur. For simple examples it's obvious:
x = 0.75 = (1 + 0.5) * 2^-1
y = 0.5 = 1 * 2^-1
z = x - y = 0.25 = 0.5 * 2^-1 = 1 * 2^-2
But what if I have x and y such that all significant digits are used and they have the same exponent? My intuition tells me the result should be exact, but I would like to see some kind of proof for this. Is it different if the result is negative?
I am assuming that you want the two numbers to have the same sign. If not, the answer is "yes"; consider
(-1) - nextafter(1, infinity)
, which works out to-2
in floating-point arithmetic with round-to-even.Under this assumption, the answer is "no." This is (almost) a special case of Sterbenz's theorem: If
x
andy
are floating-point numbers of opposite signs such that|y|/2 <= x <= 2|y|
, thenx + y
is exactly-representable as a floating-point number.I say "almost" because your statement also works for zero and subnormal numbers.