arccos ((sin (x) ^ 2) + cos (x) ^ 2) не равно 0 для определенных углов - PullRequest
1 голос
/ 07 октября 2019

Я борюсь с простой задачей вычисления.

По теории для произвольного угла:

Если

- это

enter image description here

Если я реализую это в python или Matlab:

import numpy as np

alpha = -89.999961

alpha_rad =  np.deg2rad(alpha)
result = np.arccos(np.sin(alpha_rad)**2 + np.cos(alpha_rad)**2)

print('%.16f' % result)

ведет к

0.0000000149011612

, тогда как

alpha = -89.9999601

приводит к

0.0000000000000000

Это также практически 0 при использовании -89,9999962 °,но это снова 1.49011612e-08 для альфа = -89.9999 °

Кто-нибудь знает причину этого и какие углы приведут к результатам больше 0. Я не большой специалист по численной математике, ноинтервал с плавающими числами значительно меньше (2.220446049250313e-16). Я хочу умножить результат на большое число, поэтому было бы здорово, если бы результат был равен 0 с точки зрения расстояния между числами с плавающей запятой.

Любая помощь и объяснения приветствуются!

Ответы [ 2 ]

1 голос
/ 07 октября 2019

решает задачу для произвольных углов. Кузин известен для численных задач (например, https://www.nayuki.io/page/numerically-stable-law-of-cosines)

1 голос
/ 07 октября 2019

То же самое и в Java, и в других языках программирования. Дробная часть числа с плавающей запятой конечна, поэтому при разрешении определенных значений возникают вычислительные ошибки. Так что в некоторых случаях вам нужно округлить, чтобы получить ожидаемый результат.

Вот пример Java той же проблемы.

      double[] angles = { 23.4, 22, 78.3, 92.4
      };

      for (double a : angles) {
         double val = Math.sin(a) * Math.sin(a) + Math.cos(a) * Math.cos(a);
         System.out.println(Math.acos(val) + " " + a);
         System.out.println("-------------------------------");
      }
   }

Если вы ищете такие предметы, как dealing with floating point errors, выможет получить некоторое представление об этом, а также о том, как справиться с этим.

...