1

给定双精度值:

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;

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

所以这就是我需要的。

谢谢。

4

2 回答 2

1

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

这是一个说明这一点的简单示例(在 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);

当您运行它时,此示例将打印以下内容

0.3333333333333333
0.33333333333333326
false

当添加的值的指数不同时,结果变得更加明显。例如,如果您将b' 值从0.5to更改为100000,则差异会更大

0.3333333333333333
0.3333333333284827
false

改变b1E15_

0.3333333333333333
0.375
false

更改b1E20甚至会使原来的痕迹a消失:

0.3333333333333333
0.0
false
于 2013-11-03T12:34:20.647 回答
0

不必要。例如:

> a=1.1; b=10; (a-b) + b
1.0999999999999996
于 2013-11-03T12:39:27.503 回答