Floating point 连续加减双值

Floating point 连续加减双值,floating-point,floating-accuracy,double-precision,Floating Point,Floating Accuracy,Double Precision,给定双值: double a double b b < a 那么,双倍数字是否保证: d == a ? 例如: double c = 20.0d - 2.0d; double d = c + 2.0d; d是否会再次等于20.0d? 所以一般来说,我会问,如果我减去并加上相同的两倍,它仍然是相同的吗 同样的价值? 这只是a=20.0d和b=2.0d的一种情况。 我需要确定每一个双精度值 我举了这样的例子: double s = 4.8d; System.out.print(s + "

给定双值:

double a
double b
b < a
那么,双倍数字是否保证:

d == a ?
例如:

double c = 20.0d - 2.0d;
double d = c + 2.0d;
d是否会再次等于20.0d? 所以一般来说,我会问,如果我减去并加上相同的两倍,它仍然是相同的吗 同样的价值? 这只是a=20.0d和b=2.0d的一种情况。 我需要确定每一个双精度值

我举了这样的例子:

double s = 4.8d;
System.out.print(s + "\n");
s -= 0.4d;
System.out.print(s + "\n");
s += 0.4d;
System.out.print(s + "\n");
对于本例,结果符合我的预期:

4.8
4.3999999999999995
4.8
这就是我需要的


谢谢。

尽管这适用于20和2,但它在一般情况下肯定不起作用:当加法强制表示的指数部分增加时,它将中断为双值:结果将失去一些精度

下面是一个简单的示例(Java)来说明这一点:

double a = 1.0 / 3;
double b = 0.5;
double c = a + b;
double d = c - b;
System.out.println(a);
System.out.println(d);
System.out.println(a == d);
:

当所加数值的指数不同时,结果变得更加明显。例如,如果将
b
的值从
0.5
更改为
100000
,则:

b
更改为
1E15

0.3333333333333333
0.375
false
b
更改为
1E20
会使原始
a
的痕迹消失:

0.3333333333333333
0.0
false

虽然这适用于20和2,但它在一般情况下肯定不会起作用:当加法强制表示的指数部分增加时,它将中断为双值:结果将失去一些精度

下面是一个简单的示例(Java)来说明这一点:

double a = 1.0 / 3;
double b = 0.5;
double c = a + b;
double d = c - b;
System.out.println(a);
System.out.println(d);
System.out.println(a == d);
:

当所加数值的指数不同时,结果变得更加明显。例如,如果将
b
的值从
0.5
更改为
100000
,则:

b
更改为
1E15

0.3333333333333333
0.375
false
b
更改为
1E20
会使原始
a
的痕迹消失:

0.3333333333333333
0.0
false

不一定。例如:

> a=1.1; b=10; (a-b) + b
1.0999999999999996

不一定。例如:

> a=1.1; b=10; (a-b) + b
1.0999999999999996

如果您不知道
b
,而是知道
a/2
,则您所询问的财产有效。这是Sterbenz引理。如果你知道
a/2
,而不是
b
,那么你所询问的属性是有效的。这是Sterbenz引理。这个例子不满足问题中的
b
前提条件(当然,尽管存在这样的例子)。这个例子不满足问题中的
b
前提条件(当然,尽管存在这样的例子)。