我需要找到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这样的值仍然没有成功。任何人都可以帮助我吗?
答案 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。