也学C语言,写了个程序有点问题
原书里面的一段
输入
结果
网页版计算器
程序写的有问题和网页版对应不起来,请问各位老师哪里有问题呢?
#include <stdio.h>
void main() {
float shurur [] = {0.3535,0.3535,0.6464,1.0607,0.3535,-1.0607,-1.3535,-0.3535};
float shurui [] = {0,0,0,0,0,0,0,0};
float shuchur;
float shuchui;
float b0r,b0i,b1r,b1i,b2r,b2i,b3r,b3i,b4r,b4i,b5r,b5i,b6r,b6i,b7r,b7i;
float d0r,d0i,d1r,d1i,d2r,d2i,d3r,d3i,d4r,d4i,d5r,d5i,d6r,d6i,d7r,d7i;
float c5r,c5i,c7r,c7i;
/*一*/
b0r=shurur+shurur;
b0i=shurui+shurui;
b4r=shurur-shurur;
b4i=shurui-shurui;
b2r=shurur+shurur;
b2i=shurui+shurui;
b6r=shurur-shurur;
b6i=shurui-shurui;
b1r=shurur+shurur;
b1i=shurui+shurui;
b5r=shurur-shurur;
b5i=shurui-shurui;
b3r=shurur+shurur;
b3i=shurui+shurui;
b7r=shurur-shurur;
b7i=shurui-shurui;
/*二*/
d0r=b0r+b2r;
d0i=b0i+b2i;
d2r=b0r-b2r;
d2i=b0i-b2i;
d6i=b6r;
d4i=b4i+d6i;
d4r=b4r;
d6r=b4r;
d1r=b1r+b3r;
d1i=b1i+b3i;
d3r=b1r-b3r;
d3i=b1i-b3i;
d5r=b5r;
d5i=b7r;
d7r=b5r;
d7i=d7r;
/*三*/
shuchur=d0r+d1r;
shuchui=d0i-d1i;
shuchur=d4r;
d5i=1.414*d5r;
shuchui=d4i+d5i;
shuchur=d2r;
shuchui=d2i+d3r;
shuchur=d6r;
d7i=-1.414*d7r;
shuchui=d6i+d7i;
shuchur=d6r;
d5i=d5r*1.414;
shuchur=d4r;
shuchui=d4i-d5i;
shuchur=d0r-d1r;
shuchui=d0i-d1i;
shuchur=d2r;
shuchui=d3r;
shuchur=d6r;
shuchui=d6i-d7i;
printf("%f %f\n",shuchur,shuchui);
printf("%f %f\n",shuchur,shuchui);
printf("%f %f\n",shuchur,shuchui);
printf("%f %f\n",shuchur,shuchui);
printf("%f %f\n",shuchur,shuchui);
printf("%f %f\n",shuchur,shuchui);
printf("%f %f\n",shuchur,shuchui);
printf("%f %f\n",shuchur,shuchui);
}
是对得上的啊,只是精度不够,两者的计算误差不一样而已。你改用double精度可以提高一倍。如果要更高精度的结果,某些编译器可以支持long double。能支持80位或更长的浮点数。 建议你边看C语言书边看别人写的代码, 看懂了再自己写. C语言太麻烦,不好学呀 感觉好多人研究fft scu319hy 发表于 2017-12-27 10:45
是对得上的啊,只是精度不够,两者的计算误差不一样而已。你改用double精度可以提高一倍。如果要更高精度的 ...
错误找到了,后面两步分写错了,没乘-1 本帖最后由 yjmwxwx 于 2017-12-28 13:05 编辑
这书里怎么不给个范例,自己写这么简单的几行代码都写不对,我又改了改,各位老师麻烦再给看看
#include <stdio.h>
void main() {
float shurur[] = {0.3535,0.3535,0.6464,1.0607,0.3535,-1.0607,-1.3535,-0.3535};
float b0r,b0i,b1r,b1i,b2r,b2i,b3r,b3i,b4r,b4i,b5r,b5i,b6r,b6i,b7r,b7i;
float d0r,d1r,d2r,d3r,d4r,d5r,d6r,d7r;
float d0i,d1i,d2i,d3i,d4i,d5i,d6i,d7i;
float c0r,c1r,c2r,c3r,c4r,c5r,c6r,c7r,c0i,c1i,c2i,c3i,c4i,c5i,c6i,c7i;
/*一*/
b0r=shurur+shurur;
b4r=shurur-shurur;
b2r=shurur+shurur;
b6r=shurur-shurur;
b1r=shurur+shurur;
b5r=shurur-shurur;
b3r=shurur+shurur;
b7r=shurur-shurur;
/*二*/
d0r=b0r+b2r;
d0i=0;
d2r=b0r-b2r;
d2i=0;
b6i=b6r*(-1);
b4i=0;
d4i=b4i+b6i;
d4r=b4r;
d6r=b4r;
d6i=b4i-b6i;
d1r=b1r+b3r;
d1i=0;
d3r=b1r-b3r;
d3i=0;
b7i=b7r*(-1);
d5i=b4i+b7i;
d5r=b7r;
d7r=b5r;
d7i=b4i-b7i;
/*三*/
c0r=d0r+d1r;
c0i=d0i;
c4r=d0r-d1r;
c4i=d1i;
d5i=d5r*1.414;
c1r=d4r;
c5i=d4i+d5i;
c5r=d4r;
c1i=d4i-d5i;
d3i=d3r*(-1);
c2r=d2r;
c2i=d2i+d3i;
c6i=d2i-d3i;
c6r=d2r;
d7i=d7r*(-1.4147);
c3r=d6r;
c3i=d6i+d7i;
c7r=d6r;
c7i=d6i-d7i;
printf("%f %f \n",c0r,c0i);
printf("%f %f \n",c1r,c1i);
printf("%f %f \n",c2r,c2i);
printf("%f %f \n",c3r,c3i);
printf("%f %f \n",c4r,c4i);
printf("%f %f \n",c5r,c5i);
printf("%f %f \n",c6r,c6i);
printf("%f %f \n",c7r,c7i);
}
里面还有错误,但是不知道为什么结果对了
这是算法呀,,前辈直接在c上搞呀,,感觉好痛苦。 没有拿来就能用的程序!!:lol 谢谢各位老师,我找到问题啦,原来是虚数计算的问题!
我小学文化没学过虚数计算:L 本帖最后由 yjmwxwx 于 2017-12-29 12:57 编辑
我说怎么不能理解(0.707+0.707i)×(1.414+1.414i)=1.999i呢,原来根本没学过。
早知道也好好上上学啦,我上初中就没听过课课桌里全是垃圾没书。
又改了下,这次没问题了,谢谢各位老师指导,终于把书里的计算方法写成了程序,虽然写的很烂,但是零基础学个东西不容易。
#include<stdio.h>
void main() {
float shurur[] = {0.3535,0.3535,0.6464,1.0607,0.3535,-1.0607,-1.3535,-0.3535};
float sr, si,ac,bd,ad,bc;
float b0r,b0i,b1r,b1i,b2r,b2i,b3r,b3i,b4r,b4i,b5r,b5i,b6r,b6i,b7r,b7i;
float d0r,d1r,d2r,d3r,d4r,d5r,d6r,d7r;
float d0i,d1i,d2i,d3i,d4i,d5i,d6i,d7i;
float c0r,c1r,c2r,c3r,c4r,c5r,c6r,c7r,c0i,c1i,c2i,c3i,c4i,c5i,c6i,c7i;
/*一*/
b0r=shurur+shurur;
b4r=shurur-shurur;
b2r=shurur+shurur;
b6r=shurur-shurur;
b1r=shurur+shurur;
b5r=shurur-shurur;
b3r=shurur+shurur;
b7r=shurur-shurur;
/*二*/
d0r=b0r+b2r;
d0i=0;
d2r=b0r-b2r;
d2i=0;
b4i=0;
b6i=0;
sr=0;
si=-1;
ac=b6r*sr;
bd=b6i*si;
ad=b6i*sr;
bc=b6r*si;
b6r=ac-bd;
b6i=ad+bc;
d4r=b4r+b6r;
d4i=b4i+b6i;
d6r=b4r-b6r;
d6i=b4i-b6i;
d1r=b1r+b3r;
d1i=0;
d3r=b1r-b3r;
d3i=0;
b6i=0;
b7i=0;
sr=0;
si=-1;
ac=b7r*sr;
bd=b7i*si;
ad=b7i*sr;
bc=b7r*si;
b7r=ac-bd;
b7i=ad+bc;
d5r=b5r+b7r;
d5i=b5i+b7i;
d7r=b5r-b7r;
d7i=b5i-b7i;
/*三*/
c0r=d0r+d1r;
c0i=d0i+d1i;
c4r=d0r-d1r;
c4i=d0i-d1i;
sr=0.7071;
si=-0.7071;
ac=d5r*sr;
bd=d5i*si;
ad=d5i*sr;
bc=d5r*si;
d5r=ac-bd;
d5i=ad+bc;
c1r=d4r+d5r;
c1i=d4i+d5i;
c5r=d4r-d5r;
c5i=d4i-d5i;
sr=0;
si=-1;
ac=d3r*sr;
bd=d3i*si;
ad=d3i*sr;
bc=d3r*si;
d3r=ac-bd;
d3i=ad+bc;
c2r=d2r+d3r;
c2i=d2i+d3i;
c6r=d2r-d3r;
c6i=d2i-d3i;
sr=-0.7071;
si=-0.7071;
ac=d7r*sr;
bd=d7i*si;
ad=d7i*sr;
bc=d7r*si;
d7r=ac-bd;
d7i=ad+bc;
c3r=d6r+d7r;
c3i=d6i+d7i;
c7r=d6r-d7r;
c7i=d6i-d7i;
printf("%f %f \n",c0r,c0i);
printf("%f %f \n",c1r,c1i);
printf("%f %f \n",c2r,c2i);
printf("%f %f \n",c3r,c3i);
printf("%f %f \n",c4r,c4i);
printf("%f %f \n",c5r,c5i);
printf("%f %f \n",c6r,c6i);
printf("%f %f \n",c7r,c7i);
}
看着头都大了,找到就好了。。。 慢慢琢磨吧,这个得循序渐进。 C语言太麻烦,不好学呀
呵呵,如果用汇编,可能想都不要想了。C语言只是一些计算公式,只要公式对了,数据类型对了基本就差不多了。我这里说句多余的,有些人把C言看的太那个了,我也说不清了,就像楼主就是一个,我看过他好多帖子,只是在装没知识,其实我也不知道,呵呵,楼主回答一下吧
。
页:
[1]
2