连续加减双值

时间:2013-11-03 12:20:21

标签: floating-point floating-accuracy double-precision

给出双重值:

double a
double b
b < a

如果:

double c = a - b;
double d = c + b

然后双数保证:

d == a ?

示例:

double c = 20.0d - 2.0d;
double d = c + 2.0d;

是否真的会再次等于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

所以这就是我需要的。

感谢。

2 个答案:

答案 0 :(得分:1)

虽然这适用于20和2,但它通常不会起作用:当加法强制表示的指数部分的增量时,它将中断双值:结果将失去一些精度。 / p>

这是一个简单的例子(用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);

When you run it, this example prints the following

0.3333333333333333
0.33333333333333326
false

当添加的值的指数不同时,结果变得更加明显。例如,如果您将b的值从0.5更改为100000,则difference would be a lot bigger

0.3333333333333333
0.3333333333284827
false

b更改为1E15会给出

0.3333333333333333
0.375
false

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

0.3333333333333333
0.0
false

答案 1 :(得分:0)

不一定。例如:

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