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
前提条件(当然,尽管存在这样的例子)。