方法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也是要考虑溢出的
|