比较Java中相等性的双精度值。
导读:如何解决比较Java中相等性的双精度值。?您可以尝试使用10 -15数量级的增量值,但是您会注意到某些计算会产生较大的舍入误差。此外,您进行的操作越多,累积的舍入误差就越大。一种特别糟糕的情况是,如果减去两个几乎相等的数字,例如1.0000000001-1.0并将结果与0.0000000001进...
您可以尝试使用10 -15数量级的增量值,但是您会注意到某些计算会产生较大的舍入误差。此外,您进行的操作越多,累积的舍入误差就越大。
一种特别糟糕的情况是,如果减去两个几乎相等的数字,例如1.0000000001-1.0并将结果与0.0000000001进行比较
因此,几乎没有希望找到适用于所有情况的通用方法。您始终必须计算出在特定应用中可以期望的精度,然后如果结果比该精度更接近,则认为结果相等。
例如输出
public class Main { public static double delta(double d1, double d2) {return Math.abs(d1- d2) / Math.max(Math.abs(d1), Math.abs(d2)); } public static void main(String[] args) {System.out.println(delta(0.1*0.1, 0.01));System.out.println(delta(1.0000000001 - 1.0, 0.0000000001)); }}
是
1.7347234759768068E-168.274036411668976E-8
间隔算术可用于跟踪累积的舍入误差。但是实际上,错误间隔过于悲观,因为有时舍入错误也会相互抵消。
解决方法我想从那些double在Java中使用原始相等性有更多经验的人那里获得一些建议。使用d1 ==d2两次双打d1,d2由于可能的舍入误差而不够。
我的问题是:
Java Double.compare(d1,d2) == 0在某种程度上处理舍入错误吗?如1.7文档中所述,0如果d1数值等于,则返回值d2。有人确定它们在数值上相等是什么意思吗?
对某些增量值使用相对误差计算,您会建议使用通用的增量值(不是特定于应用程序)吗?请参见下面的示例。
以下是考虑相对误差的用于检查相等性的通用函数。delta您建议从简单的+,-,/,*操作中捕获大多数舍入误差的价值是什么?
public static boolean isEqual(double d1,double d2) { return d1 == d2 || isRelativelyEqual(d1,d2);}private static boolean isRelativelyEqual(double d1,double d2) { return delta > Math.abs(d1- d2) / Math.max(Math.abs(d1),Math.abs(d2));}
相关文章:
1. vagrant - 使用NFS文件夹作为mysql datadir无法启动mysql的问题?2. javascript - kindeditor上传本地图片3. AngularJs。是否可以通过单击取消选择HTML“广播”输入?4. 性能基准:PHP生成的内容VS。JavaScript和DOM over AJAX5. java-如何使列表彼此相邻(水平)而不是向下(垂直)。6. Java等于一个类。==与.equals相同7. ios - 为什么用WKWebView加载相同的html文本,有时展示的内容却不一样。8. css和HTML样式 投票管理系统9. PHP搜索代码只能搜出一页,点击任意页码不实现10. navicat - 数据库建索引选择的是hash,但保存后自动变成了btree|实践时mysql四种引擎都有什么要注意的?