In my course, I am told:
Continuous values are represented approximately in memory, and therefore computing with floats involves rounding errors. These are tiny discrepancies in bit patterns; thus the test
e==f
is unsafe ife
andf
are floats.
Referring to Java.
Is this true? I've used comparison statements with double
s and float
s and have never had rounding issues. Never have I read in a textbook something similar. Surely the virtual machine accounts for this?
A rounding error is the difference between the number that is stored by a computer program and the actual number. Data types are often limited in the number of decimal places that they can store so a rounding error might occur if a number needs to be cut short.
It is true.
It is an inherent limitation of how floating point values are represented in memory in a finite number of bits.
This program, for instance, prints "false":
public class Main { public static void main(String[] args) { double a = 0.7; double b = 0.9; double x = a + 0.1; double y = b - 0.1; System.out.println(x == y); } }
Instead of exact comparison with '==' you usually decide on some level of precision and ask if the numbers are "close enough":
System.out.println(Math.abs(x - y) < 0.0001);
This applies to Java just as much as to any other language using floating point. It's inherent in the design of the representation of floating point values in hardware.
More info on floating point values:
What Every Computer Scientist Should Know About Floating-Point Arithmetic
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With