Точность COS (ATAN2 (Y, X)) по сравнению с использованием комплекса , C ++
-
24-09-2019 - |
Вопрос
Я пишу несколько преобразований координат (более конкретно, преобразование JoukoSwky, Википедия Джоуковский трансформ), и я заинтересован в производительности, но конечно точно. Я пытаюсь сделать преобразования координат двумя способами:
1) расчет реальных и сложных деталей в отдельном, с использованием двойной точности, как показано ниже:
double r2 = chi.x*chi.x + chi.y*chi.y;
//double sq = pow(r2,-0.5*n) + pow(r2,0.5*n); //slow!!!
double sq = sqrt(r2); //way faster!
double co = cos(atan2(chi.y,chi.x));
double si = sin(atan2(chi.y,chi.x));
Z.x = 0.5*(co*sq + co/sq);
Z.y = 0.5*si*sq;
где Chi и Z - простые структуры с двойными X и Y в качестве членов.
2) Использование сложного:
Z = 0.5 * (chi + (1.0 / chi));
Где Z и Chi являются сложными. Там интересная часть заключается в том, что действительно случай 1) быстрее (около 20%), но точность плохой, давая ошибку в третьем десятином количестве после запятой после обратного преобразования, в то время как комплекс возвращает точное число. Итак, проблема в COS (ATAN2), SIN (ATAN2)? Но если это так, как сложные обрабатывают это?
Редактировать: Просто понял, что это было не совсем вопрос, который я имел в виду. Я должен сделать общую трансформацию, как
Z = 1/2 * (Chi ^ n + (1 / Chi) ^ n), и до сих пор код выше, как я понял, чтобы сделать это. Точнее,
double sq = pow(sqrt(r2),n); //way faster!
double co = cos(n*atan2(chi.y,chi.x));
double si = sin(n*atan2(chi.y,chi.x));
Z.x = 0.5*(co*sq + co/sq);
Z.y = 0.5*(si*sq - sq/si);
Также исправляя ошибку на ZY
Решение
Я думаю, что в 1) это должно быть
Z.y = 0.5*(si*sq - si/sq);
Если вы хотите действительно хорошую производительность, вы можете вернуться к первому принципам и наблюдать, что
1/(a+ib) = (a-ib)/(a*a+b*b)
Нет sqrt()
, atan2()
или cos()
или sin()
.
Другие советы
Дано r = sqrt(x*x+y*y)
:
cos(atan2(y,x)) == x/r
sin(atan2(y,x)) == y/r
Расчет этого способа должен быть более точным и быстрее.
Когда вы подключаете эти значения в формула для ZX и ZY, квадратный корень также отменится, поэтому вы останетесь только с основными арифметическими операциями.