舍入错误?

在我的课程中,我被告知:

连续值大概在内存中表示,因此使用浮点计算涉及舍入误差。 这些是位模式中的微小差异; 因此如果ef是浮动的,测试e==f是不安全的。

引用Java。

这是真的? 我用double s和float s来比较语句,并且从来没有过四舍五入的问题。 我从来没有读过类似的教科书。 虚拟机肯定会解决这个问题?


这是真的。

这是浮点值在内存中以有限的位数表示的固有限制。

例如,这个程序打印出“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);
  }
}

不是与'=='进行精确比较,而是通常在一定程度上决定精确度,并询问数字是否“足够接近”:

System.out.println(Math.abs(x - y) < 0.0001);

这适用于Java,与使用浮点的任何其他语言一样。 它是硬件中浮点值表示的固有设计。

有关浮点值的更多信息:

每位计算机科学家应该了解的浮点算法


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

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

上一篇: Rounding Errors?

下一篇: What is the difference between gcc/g++ and cc1/cc1plus?