Я пытаюсь вычислить угол между некоторыми векторами в python2.7. Я использую следующий идентификатор, чтобы найти угол.Передача float функции с ограниченным доменом
тета = экоса (v ж/| v || ш |.)
Для конкретного экземпляра мой код:
v = numpy.array([1.0, 1.0, 1.0])
w = numpy.array([1.0, 1.0, 1.0])
a = numpy.dot(v, w)/(numpy.linalg.norm(v) * numpy.linalg.norm(w))
theta = math.acos(a)
Когда я запускаю это я получаю ошибку ValueError: math domain error
Я предполагаю, что это потому, что acos определяется только в домене [-1,1], а мое значение «a» - это float, который очень близок к 1, но на самом деле немного больше. Я могу подтвердить это с помощью print Decimal(a)
, и я получу 1.0000000000000002220446 ...
Каков наилучший способ обойти эту проблему?
Все, что я могу придумать, это проверить, что любые значения 'a' больше 1 (или меньше -1) и округляют их до точности 1. Это похоже на липкую работу. Есть ли более аккуратный/более обычный способ решения этой проблемы?
Я реализовал это загадочное решение. Он работает хорошо (спасибо), но как он работает? Похоже, что это займет угол между проекцией одного вектора на другой и ортогональным. – Jemma