舍入错误?

Hum*_*art 22 java memory floating-accuracy

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

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

参考Java.

这是真的?我使用了doubles和floats的比较语句,并且从未遇到过舍入问题.从来没有我在课本上读过类似的东西.当然虚拟机占了这个?

Chr*_*est 51

是真的.

浮点值如何在有限位数的存储器中表示是一个固有的限制.

例如,该程序打印"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);
  }
}
Run Code Online (Sandbox Code Playgroud)

而不是与'=='精确比较,你通常会决定某种程度的精确度,并询问这些数字是否"足够接近":

System.out.println(Math.abs(x - y) < 0.0001);
Run Code Online (Sandbox Code Playgroud)

  • 很好的解释.但是,您的上一个代码示例应该使用Math.abs(x-y)而不是x-y. (2认同)

Ben*_*ehn 26

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

有关浮点值的更多信息:

每个计算机科学家应该知道的浮点运算

  • 一点:如果两个计算完全相同,那么它们的结果值也将是相同的.当两个计算在数学上相等但不同时,就会出现问题. (3认同)

duf*_*ymo 8

是的,在base-2中精确地表示0.1与尝试在base 10中精确表示1/3相同.