Philipp wrote:
Hello,
I'm aware of problems (rounding, NaN etc) when comparing floating
point values in computers.
In C++ this goes a bit further as you cannot compare with certitude
floating point numbers even if you have made exactly the same
operations on each of them (see eg:
http://www.parashift.com/c++-faq-lite/newbie.html#faq-29.18 )
My question: In Java, will unchanged values compare strictly true if
equal?
Is it _guaranteed_ that the following code does output "true" on all
JVMs?
Thanks for answers. Phil
example code:
public class Test {
public static void main(String[] args) {
float a = 1;
float b = 1;
System.out.println("a == b?: " + (a == b));
}
}
Java does not permit reordering optimizations that could affect a
floating point result.
In strictfp mode, the exact, bit-by-bit, result is predictable from the
source code for any Java implementation.
Without strictfp, the implementation is allowed, but never required, to
use a wider exponent for some intermediate results. That may suppress an
overflow to infinity or underflow to zero (for numbers too tiny to be
represented as denormalized with the correct exponent width).
That would allow some calculations to get different results depending on
issues such as whether a value was kept in a register or stored to a
memory temporary.
If you are just concerned about issues such as whether Java will
arbitrarily reorder expressions, you are fine in default mode. If you
really need exact equality on every identical source calculation, you
need strictfp.
Thanks for that very precise and complete response.