我在Java中进行了以下双重计算:
double C1 = some value; // It's always an integer
double C2 = some value; // It's always integer, and C2 >= C1
double S = some value; // It's always 0 < S <= 1
double carry = some value; // It's always 0 <= carry < 1
double rate = ((C1/C2)/S);
double C3 = Math.floor( (rate * S * C2) + carry );
现在,如果我们没有失去精确度,C3 == C1
将是真的。但由于我们失去了精确度,C3
和C1
仍然总是相等吗?
如果他们不总是平等,如果我有C1
,C2
,S
和C3
,我怎么能修改rate
到确保计算后C3
等于C1
?
注意:遗憾的是,使用BigDecimal不是一种选择。
答案 0 :(得分:3)
通常,我们不会直接通过==
比较两个双值。相反,我们衡量它们之间的差异。例如Math.abs(C3 - C1) < 1e-6
。
答案 1 :(得分:3)
不是这样。
浮点是近似值。添加到尾数的下一个双位1位可能会导致这两个双精度数之间的大指数存在相当大的差距。
S接近0将导致巨大的双打,它们之间有很大的差距。通过这种简单的舍入,这将不再是可纠正的。即使小S不会导致除法超过INFINITY的双倍范围。
一个人可以很容易地达到1000。