Точность COS (ATAN2 (Y, X)) по сравнению с использованием комплекса , C ++

StackOverflow https://stackoverflow.com/questions/2581250

Вопрос

Я пишу несколько преобразований координат (более конкретно, преобразование 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, квадратный корень также отменится, поэтому вы останетесь только с основными арифметическими операциями.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top