【发布时间】:2019-01-12 18:40:18
【问题描述】:
是否有任何 Java 内置函数或更好的解决方案来查找浮点错误?
或者,换句话说,有没有办法找出我可以添加到double 变量中的最小值,该变量不会因浮点舍入而被忽略?
现在我认为获得它的一个好方法是翻转其中的最后一位,从变量中减去它,并将结果也返回为double。
double getFloatPointError(double in){
long bits = Double.doubleToLongBits(in);
bits^=1;
return Math.abs(in-Double.longBitsToDouble(bits));
}
我认为这不是一个好的解决方案,因为输出结果本身是double,因此也容易出现浮点错误并可能给出不正确的结果。另外,我可能正在用这种方法重新发明轮子,这是我想避免的。
澄清:我知道什么是浮点值,我知道在准确性很重要时不应该使用它们,并且我知道为此我应该使用BigDecimal。请不要发布与浮点相关的一般信息和建议,因为它们不太可能包含我的问题的答案。
【问题讨论】:
-
如果精度甚至很重要,我会使用
BigDecimal而不是double -
@dtanabe 是的,这似乎是重复的。对不起,不知道它叫“Epsilon”。虽然,他们的问题是关于
1.0l附近的错误常数值... -
这篇文章在浮点精度上真的很不错:docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
-
请注意:“我可以添加到不会被忽略的双精度变量的最小值”取决于该变量的当前值。比如当前值很大,甚至+1都可以忽略。
标签: java floating-point precision