C++ cos(atan2(y,x))与使用复合物的精度<;双倍>;,C++;

C++ cos(atan2(y,x))与使用复合物的精度<;双倍>;,C++;,c++,performance,numbers,complex-numbers,atan2,C++,Performance,Numbers,Complex Numbers,Atan2,我正在写一些坐标变换(更具体地说是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,c

我正在写一些坐标变换(更具体地说是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);
同时纠正了Z.y.上的错误。

我认为在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)

用这种方法计算应该更准确、更快


当您将这些值插入Z.x和Z.y的公式中时,平方根也将被抵消,因此您将只剩下基本的算术运算。

您想知道计算有多复杂吗?请原谅我的无知。难道不是cos(atan2(y,x))==x,sin(atan2(y,x))==y?(如果x,y是标准化的?)谢谢你的回答!这真是个愚蠢的错误。我使用这个符号是因为我必须将这个表达式提高到n的幂,因为Z=0.5(chi^n+(1/chi)^n),所以它变成sq=pow(r2,n)co=cos(n*atan2(chi.y,chi.x)),这是我发现的唯一方法。在显式情况下,是的,但在一般情况下Z=1/5(chi^n+(1/chi)^n)。我应该说得更准确些,对不起,我已经更正了原来的帖子。谢谢你的帮助!
cos(atan2(y,x)) == x/r
sin(atan2(y,x)) == y/r