方法1:复数相除(a+bi)/(c+di),以前写过测试程序,用64位累加
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <complex.h>
int32_t a[2]={1234567,1234567};
int32_t b[2]={312345,932323};
int32_t t[2]={0,0};
void cdiv(int32_t *a,int32_t *b,int32_t *result)
{
int64_t D=(int64_t)b[0]*(int64_t)b[0]+(int64_t)b[1]*(int64_t)b[1];
int64_t N0=(int64_t)a[0]*(int64_t)b[0]+(int64_t)a[1]*(int64_t)b[1];
int64_t N1=(int64_t)a[1]*(int64_t)b[0]-(int64_t)a[0]*(int64_t)b[1];
result[0]=N0*1000/D;
result[1]=N1*1000/D;
printf("%I64d,%I64d,%I64d\n",N0,N1,D);
}
int main()
{
double complex A=a[0]+a[1]*I;
double complex B=b[0]+b[1]*I;
cdiv(a,b,t);
printf("%d,%di\n",t[0],t[1]);
printf("%lf,%lfi\n",creal(A/B),cimag(A/B));
return 0;
}
方法2:你给出的方法复数的指数形式,后来没折腾了,用c数学库解决了。主要是我用了沃尔什变换,比dft快很多,节省了时间。
有√(a^2+b^2),这个a^2+b^2也是要考虑溢出的
|