在我的过程中,有人告诉我:

  

连续值在存储器近似表示,并因此与浮子计算涉及舍入误差。这些是位模式微小的差异;因此测试e==f是不安全的,如果ef是浮动。

参照的Java。

这是真的吗?我用与doubles和floats比较语句和从未有过的四舍五入问题。我从来没有在类似教科书的东西读。可靠地将虚拟机解释这种?

有帮助吗?

解决方案

确实

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

此方案,例如,输出 “假”:

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恰好相同试图代表1/3恰好在底座10

这是总是如此。有一些数字不能被使用浮点表示准确地表示。举个例子,PI。你将如何代表了一些具有无限的数字,有限的存储中?因此,在比较数字时,你应该检查一下它们之间的差别较小那么一些小量。此外,也有其存在,可以帮助您实现更高的精度,如BigDecimal和BigInteger的几类。

它是正确的。需要注意的是Java有什么用它做,问题是在浮点运算中固有的所有的语言。

您经常可以逃脱它与课堂层面的问题,但它不会在现实世界中的工作。有时,它不会在课堂上工作。

这是不久前回到了学校的事件。前奏的班主任老师分配了被证明是一个真正的讲给了很多好学生的期末考试的问题 - 它不工作,他们不知道为什么。 (我认为这是一个实验室助理,我是不是在课堂上。)最后,一些开始问我的帮助,一些探测技术发现的问题:他们从来没有被教导有关浮点运算的固有误差

现在,有这种问题的两种基本方法,蛮力一个(这偶然曾在这种情况下,它使每一次同样的错误)和更优雅的一个(这将使不同的错误,而不是工作。 )任何人谁试图优雅的方式将撞了南墙,而无需任何想法,为什么。我帮一帮他们,并停留在注释解释为什么和他是否有问题,请联系我。

当然,下学期我从他那里听到这个我基本上地板全系有一个简单的小程序:

10 X = 3000000
20 X = X + 1
30 If X < X + 1 goto 20
40 Print "X = X + 1"

尽管在什么部门每一位教师认为,这种的的终止。 300万种子仅仅是为了让它终止更快。 (如果你不知道基本的:有没有噱头这里,只是用尽浮点数的精度。)

是,作为其他的答案都表示。我想补充一点,我建议你这篇文章的浮点精确度:可视化花车

大多数的CPU(和计算机语言)使用IEEE 754浮点算术。使用这个符号,有一些还没有确切的表示这个符号十进制数,例如0.1。所以,如果你除以10 1,你不会得到一个确切的结果。当连续进行数计算,错误总结。尝试在python下面的示例:

>>> 0.1
0.10000000000000001
>>> 0.1 / 7 * 10 * 7 == 1
False

这不是真的你数学期望的。

顺便说一句: 关于浮点数常见的误解是,认为结果并不精确,不能安全comapared。如果你真的用数字的分数,这是唯一真正的。如果你所有的数学是在整数域,双打和彩车做完全一样的整数,也可以安全地进行比较。它们可安全地用作循环计数器,例如

是,Java也使用浮点算术

当然这是真的。想想吧。任何数量必须以二进制来表示。

照片: “1000” 作为0.5or 1/2,即2 ** -1。然后 “0100” 为0.25或1/4。你可以看到,我要去哪里。

在多少个数字可以以这种方式代表了什么? 2 ** 4。添加更多的位复制的可用空间,但它从来都不是无限的。 1/3或1/10,对于物质的1 / n,任何数量不是多个的2不能真正代表。

1/3可以是 “0101”(0.3125)或 “0110”(0.375)。如果乘以3,要么值,会不会是1。当然,你可以添加特殊的规则中。说你“时加3次‘0101’,使之1” ......这种做法不会在长期运行。你可以捕捉一些,但再怎么约1/6倍2?

这不是二进制表示的问题,任何有限表示有,你不能代表数字,它们是无限的毕竟。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top