有效地处理极小数量的浮点不准确性

时间:2018-04-13 02:36:52

标签: java math floating-point double precision

我正在使用的程序使用OpenStreetMap数据来渲染地图。数据由4个坐标组成,这些坐标构成数据的边界。

我画线,有时超过这些界限 - 我想让线条在边界的确切点停止,当一条线由一个点内部和一个点组成时。并且在界外发生。因为我知道边界的点,以及边界内外的点 - 我可以计算这两条线之间的交点,但不准确性非常不一致。在里面 first picture attached,你可以看到,路口在哪里。在second picture attached上,您可以看到交叉点之间的位置 - 这是我遇到过的最糟糕的情况。

这些是我正在使用的坐标:

  • 第一点:x:7.040283679962158,y:-55.59856033325195

  • 第二点:x:7.04131555557251,y:-55.5977783203125

  • 第三点:x:6.991822718617924,y:-55.5984

  • 第四点:x:7.2029868530932735,y:-55.5984

  • 交点:x:7.039072513580322,y:-55.5984001159668

  • Wolfram alpha建议x应为约。 7.0405

由于数字非常小并且计算很多,我想在计算之间存在很多损失,这是代码,进行计算 - 抱歉你强迫你阅读这个折扣 - 贫民窟代码。 OSMNode包含经度和纬度坐标 - 因此它们在这个意义上充当Point2D。

private OSMNode calculateIntersectionNode(OSMNode line1Node1, OSMNode line1Node2, OSMNode line2Node1, OSMNode line2Node2) {
    double lon1 = line1Node1.getLon();
    double lon2 = line1Node2.getLon();
    double lon3 = line2Node1.getLon();
    double lon4 = line2Node2.getLon();
    double lat1 = line1Node1.getLat();
    double lat2 = line1Node2.getLat();
    double lat3 = line2Node1.getLat();
    double lat4 = line2Node2.getLat();
    double intersectionLon = ( ( (((lon1*lat2) - (lat1*lon2)) * (lon3-lon4)) - ((lon1-lon2) * ((lon3*lat4) - (lat3*lon4))) ) / ( ((lon1 - lon2) * (lat3 - lat4)) - ( (lat1 - lat2) * (lon3 - lon4)) ) );
    double intersectionLat = ( ( (((lon1*lat2) - (lat1*lon2)) * (lat3-lat4)) - ((lat1-lat2) * ((lon3*lat4) - (lat3*lon4))) ) / ( ((lon1 - lon2) * (lat3 - lat4)) - ( (lat1 - lat2) * (lon3 - lon4)) ) );
    return new OSMNode(intersectionLon, intersectionLat);
}

我是否会以某种方式在代码中投入更多精度?我是否改变了计算交叉路口的方式或第三种方式 - 我目前在我的脑海里空洞。

提前致谢!

1 个答案:

答案 0 :(得分:0)

正如所怀疑的那样,错误是我自己的 - 问题是一个索引错误,由于使用了返回独占索引值的函数,因此很难发现,而我正在使用其他类的包容性

我不知道这里有什么传统 - 我是关闭这个问题还是删除它?