繁体   English   中英

Java双丢失精度计算

[英]Java double losing precision calculation

我在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将是真的。 但由于我们失去了精度, C3C1仍然总是相等吗?

如果它们不总是相等,如果我有C1C2SC3 ,我怎么能修改rate以确保计算后C3等于C1

注意:遗憾的是,使用BigDecimal不是一种选择。

通常,我们不直接通过==比较两个double值。 相反,我们衡量它们之间的差异。 例如, Math.abs(C3 - C1) < 1e-6

不是这样。

浮点是近似值。 添加到尾数的下一个双位1位可能会导致这两个双精度数之间的大指数存在相当大的间隙。

S接近0将导致巨大的双打,它们之间有很大的差距。 通过这种简单的舍入,这将不再是可纠正的。 即使小S不会导致划分超过INFINITY的双倍范围。

一个人可以容易地达到1000。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM