警告浮点

时间:2015-03-09 16:26:35

标签: floating-point

我需要找到Double的三个值x,y,z,这样(x + y)+ z == 1.0和x +(y + z)== 0.0。我试图在Scala上解决这个问题。这个问题与Is floating point math broken?有关,但是我应该如何找到这样的价值?有没有算法来完成这项任务?从我所读到的,如果分母是2的幂,它将被转换为浮点而没有错误。我尝试过像0.5,1,0,0.25这样的值仍然没有成功。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:3)

使用正确的x,y和z值,可以精确地获得1.0和0.0,而无需在比较中使用epsilon。我用Java编写了我的程序,但原理将贯穿其他语言,使用IEEE 754 64位二进制浮点数为Double。

public class Test {
  public static void main(String[] args) {
    double x = -Math.pow(2.0, 53);
    double y = 1.0;
    double z = -x;
    System.out.println((x + y) + z == 1.0);
    System.out.println(x + (y + z) == 0.0);
  }
}

[-Math.pow(2.0, 53), Math.pow(2.0, 53)]是双精度范围,其中所有整数值都可以精确表示。在该范围之外,所有奇数都必须舍入。将两端的幅度增加1需要舍入,并且甚至可以回到自身。

具有相反符号的

x + y在范围内并且可以准确表示。将z添加到结果中将获得1.0,即添加的实数结果。另一方面,y + z具有相同的符号,使得奇数整数的幅度太大而无法准确表示,因此它会舍入到z,而添加x会导致0.0。