Как точно рассчитать расстояния в Java? - PullRequest
0 голосов
/ 06 августа 2020

Я использую реализацию этого ответа для расчета расстояния между двумя точками для моего программного обеспечения GPS-слежения.

Однако я читал на многочисленных StackOverFlow, которые используют double неверно из-за неточного представления значений с плавающей запятой. Поэтому я спрашиваю:

  • Будет ли использование BigDecimal для расчета расстояний более точным?
  • Не приведет ли преобразование результата из BigDecimal обратно в double к дополнительным неточностям? (для сохранения или получения значения)

Ответы [ 2 ]

3 голосов
/ 06 августа 2020

Нет, использование BigDecimal вместо double существенно не повысит точность этого алгоритма.

Основной источник ошибки - ошибка моделирования: вы используете формулу, которая предполагает, что Земля идеальная сфера. Это означает, что результат может быть ошибочным на 0,5%. Ошибка округления при использовании double составляет порядка 0,000000000001%.

Чтобы получить более точные результаты, вы можете использовать, например, формулы Винсенти , в которых предполагается, что Земля является эллипсоидом, но его труднее реализовать, чем расстояние большого круга. Чтобы получить еще более точные результаты, следует учитывать местную топографию, что еще сложнее.

Для дальнейшего чтения: https://en.m.wikipedia.org/wiki/Geographical_distance

1 голос
/ 06 августа 2020

Да, теоретически выполнение любых вычислений в BigDecimal может привести к большей точности, но это очень вряд ли действительно поможет по нескольким причинам:

  • как вы обнаружили существуют ненастные алгоритмы для расчета расстояния с использованием только double без чрезмерной числовой ошибки.
  • точность значений double для этого варианта использования на много порядков выше, чем точность и точность любой позиционной информации, с которой вы могли бы начать. Это означает, что ошибка измерения определенно будет больше, чем числовая ошибка, вызванная использованием double.

И если вы все равно выполнили свои вычисления в BigDecimal, а затем преобразовали результат в double , тогда вы, конечно, потеряете точность, поскольку BigDecimal может быть произвольно точным, а double - нет.

Но опять же: эта потеря точности не имеет отношения к описываемому вами варианту использования .

...