我正在编写一些坐标变换(更具体地说是 Joukoswky 变换,维基百科 Joukowsky 变换),我对性能感兴趣,但当然对精度感兴趣。我正在尝试以两种方式进行坐标转换:
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 上的错误