Я испытываю то, что, по моему мнению, странное поведение с использованием кросс-продукта в numpy
с несколько большими значениями.численная точность кросс-продукта в numpy
Е.Г., следующее кажется правильным:
r = 1e15
a = array([1, 2, 3]) * r;
b = array([-1, 2, 1]) * r;
c = cross(a/norm(a), b/norm(b));
print(dot(c, a)) # outputs 0.0
Но если поднять показатель на 1, мы получим:
r = 1e16
a = array([1, 2, 3]) * r;
b = array([-1, 2, 1]) * r;
c = cross(a/norm(a), b/norm(b));
print(dot(c, a)) # outputs 2.0
Числа получить еще более странным для больших значений показателя. Кто-нибудь знает, что здесь происходит? Благодаря!
Вы уверены, что обратились к проблеме? 64-битное число с плавающей запятой должно иметь мантисса 11 бит, правильно? Это, безусловно, должно учитывать размер чисел, с которыми я работаю. – Brian
Хорошо - я вижу это сейчас - это происходит в точности умножения во время точечного продукта. 'a' велико. Числовая точность 64-битного поплавка - 52 бит. 2^52 составляет чуть более 10^15, после чего проблемы с ошибкой округления, похоже, эскалации. Я думаю, было бы полезно указать размер 64-битного коэффициента с плавающей запятой и мантиссы в ответе. Спасибо за помощь! – Brian