У меня очень странная ситуация: я вычисляю угол между двумя векторами в сферической системе координат. Сначала я вычисляю скалярное произведение двух векторов. Вычисление с использованием массива numpy дает результат с относительной точностью 10^(-16), как и должно быть для 64-битных чисел с плавающей запятой. Но затем я вызываю acos, и угол скалярного произведения numpy дает относительную точность 10^(-11), т.е. на 5 порядков или величину хуже по сравнению с прямым вычислением (что является правильным результатом). Есть идеи, почему?
#!/usr/bin/python
import numpy as np
import math
def testPrecision(theta1, phi1, theta2, phi2):
# We define two vectors as numpy arrays
t1 = np.array([math.sin(theta1) * math.cos(phi1), math.sin(theta1) * math.sin(phi1), math.cos(theta1)])
t2 = np.array([math.sin(theta2) * math.cos(phi2), math.sin(theta2) * math.sin(phi2), math.cos(theta2)])
# scalar product of vectors using numpy
scalarProd1 = np.einsum('i,i', t1, t2)
# scalar product of vectors without numpy
scalarProd2 = math.sin(theta1) * math.cos(phi1) * math.sin(theta2) * math.cos(phi2) + math.sin(theta1) * math.sin(phi1) * math.sin(theta2) * math.sin(phi2) + math.cos(theta1) * math.cos(theta2)
print("Scalar product:\nnumpy = {:.15e} vs direct = {:.15e}".format(scalarProd1, scalarProd2))
alpha1 = math.acos(scalarProd1)
alpha2 = math.acos(scalarProd2)
print("Angle:\nnumpy = {:.15e} vs direct = {:.15e}".format(alpha1, alpha2))
testPrecision(theta1 = 1.745329251994330e-02, theta2 = 2.154759397163566e-02, phi1 = 1.745329251994329e-01, phi2 = 2.078144368653071e-01)
Результат
Scalar product:
numpy = 9.999914101231913e-01 vs direct = 9.999914101231911e-01
Angle:
numpy = 4.144849600753233e-03 vs direct = 4.144849600780019e-03
Подробнее здесь: https://stackoverflow.com/questions/788 ... lculations
Потеря точности с плавающей запятой в вычислениях Python numpy ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Возможная потеря точности во время преобразования числа с плавающей запятой.
Anonymous » » в форуме JAVA - 0 Ответы
- 18 Просмотры
-
Последнее сообщение Anonymous
-