Rounding Errors?

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 if e and f 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?


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


是的,在基数2中恰好代表0.1与在10代中完全代表1/3相同。

链接地址: http://www.djcxy.com/p/15048.html

上一篇: Float vs ActiveRecord中的十进制

下一篇: 舍入错误?