我是一个电子工程师,不是编码专家,请见谅。
我正在使用 Embarcadero C++ Builder (XE3)。
我有一个FFT算法需要对复数执行大量操作。我发现,如果我绕过Embarcadero的复杂数学库,在我的代码中进行所有计算,我的FFT将运行得快大约4.5倍。这里显示的4个操作都需要很长时间。
#include <dinkumware\complex>
#define ComplexD std::complex<double>
ComplexD X, Y, Z, FFTInput[1024];
double x, y;
Z = X * Y;
x = X.real();
y = X.imag();
Z = ComplexD(x,y);
将乘法替换为自己的叉乘,可以使我的执行时间减半。然而,我担心的是我访问输入数组的实部和虚部的方式。我是这样做的:
double *Input;
Input = reinterpret_cast<double *>(FFTInput);
// Then these statements are equivalent.
x = FFTInput[n].real();
y = FFTInput[n].imag();
x = Input[2*n];
y = Input[2*n+1];
这样做使我的执行时间再次减半,但我不知道这个reinterpret_cast是否明智。我可以将输入数组更改为两个double而不是一个复数,但我在许多程序中使用这个FFT,不想重写所有内容。
这个reinterpret_cast是否可以?还是会有内存问题?另外,有没有办法让Embarcadero的复杂数学函数运行得更快?最后,虽然对我来说并不是非常重要,但这个reinterpret_cast是否可移植?
reinterpret_cast
永远不是完全正确的,这取决于您的机器和编译器是否支持。看起来您可能能够使用它,但我建议您考虑更换编译器。 - n. m.#define ComplexD std::complex<double>
是糟糕的代码。请改用以下方式:typedef std::complex<double> ComplexD;
- Angew is no longer proud of SO