英文:
How to precisely calculate distances in Java?
问题
我正在使用这个答案的实现来计算我的GPS跟踪软件中两点之间的距离。
然而,我在许多StackOverflow帖子上都看到,使用double
是不好的,因为它会导致值的不准确的浮点表示。因此,我想问:
-
使用
BigDecimal
来计算距离会更准确吗? -
将BigDecimal的结果转换回
double
会产生额外的不准确性吗?(用于存储或检索值)
英文:
I'm using an implementation of this answer to calculate the distance between two points for my GPS tracking software.
However I've read on numerous StackOverFlow that using double
is bad because of the inaccurate float representation of values. Therefore, I'm asking :
-
Would using
BigDecimal
to calculate distances be more accurate ? -
Would converting the result from BigDecimal back to
double
produce additional inaccuracies ? (to store or retrieve the value)
答案1
得分: 3
不,使用BigDecimal
而不是double
不会显著提高此算法的准确性。
主要的误差源是建模误差:您使用的公式假定地球是一个完美的球体。这意味着结果可能出现多达0.5%的错误。使用double
会产生大约0.000000000001%的舍入误差。
为了获得更精确的结果,您可以使用例如Vincenty的公式,它假设地球是一个椭球,但它比大圆距离更难实现。要获得更精确的结果,您应该考虑到本地地形,这更加困难。
进一步阅读:https://en.m.wikipedia.org/wiki/Geographical_distance
英文:
No, using BigDecimal
instead of double
will not significantly improve the accuracy of this algorithm.
The main source of error is a modeling error: you're using a formula that assumes the Earth is a perfect sphere. This means the result can be wrong by as much as 0.5%. The rounding error you get from using double is on the order of 0.000000000001%.
To get more accurate results, you could use for example Vincenty's formulae, which assumes the Earth is an ellipsoid, but it is harder to implement than the great circle distance. To get even more accurate results, you should take into account the local topography, which is even harder.
For further reading: https://en.m.wikipedia.org/wiki/Geographical_distance
答案2
得分: 1
是的,理论上在BigDecimal
中进行任何计算可能会导致更好的精度,但出于多种原因,这种情况几乎不可能真正有所帮助:
- 正如你所发现的,有非朴素的算法可以在仅使用
double
而不产生过多数值误差的情况下计算距离。 - 对于这种用例,
double
值的精度要比您可能开始时拥有的任何位置信息的精度和准确性高出多个数量级。这意味着测量误差肯定会比使用double
引起的数值误差大。
如果你无论如何在BigDecimal
中进行计算,然后将结果转换为double
,那么你当然会失去精度,因为BigDecimal
可以有效地具有任意精度,而double
不能。
但再次强调:对于你描述的用例来说,这种精度损失是不相关的。
英文:
Yes, in theory doing any calculations in BigDecimal
could lead to better precisions, but that is very unlikely to actually help for several reasons:
- as you found out there are non-naive algorithms to calculate the distance using only
double
without an excessive numerical error. - the precision of
double
values for this use case is many orders of magnitude higher than the precision and accuracy of any positional information you might start out with. That means that the measurement error will definitely be bigger than the numerical error caused by usingdouble
.
And if you did your calculations in BigDecimal
anyway and then converted the result to double
, then you'd lose precision, of course, since BigDecimal
can be effectively arbitrarily precise, but double
can't.
But again: that loss of precision is irrelevant for the use case you describe.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论