yjmwxwx 发表于 2017-12-27 04:55:30

也学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);


}


scu319hy 发表于 2017-12-27 10:45:46

是对得上的啊,只是精度不够,两者的计算误差不一样而已。你改用double精度可以提高一倍。如果要更高精度的结果,某些编译器可以支持long double。能支持80位或更长的浮点数。

leonliu_2811 发表于 2017-12-27 15:22:02

建议你边看C语言书边看别人写的代码, 看懂了再自己写.

glff9 发表于 2017-12-27 15:47:05

C语言太麻烦,不好学呀

zystbbs 发表于 2017-12-27 20:03:13

感觉好多人研究fft

yjmwxwx 发表于 2017-12-28 00:36:30

scu319hy 发表于 2017-12-27 10:45
是对得上的啊,只是精度不够,两者的计算误差不一样而已。你改用double精度可以提高一倍。如果要更高精度的 ...

错误找到了,后面两步分写错了,没乘-1

yjmwxwx 发表于 2017-12-28 13:01:58

本帖最后由 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);


}



里面还有错误,但是不知道为什么结果对了

zhangxiyi5277 发表于 2017-12-28 22:04:56

这是算法呀,,前辈直接在c上搞呀,,感觉好痛苦。

平凡8236 发表于 2017-12-29 11:46:46

没有拿来就能用的程序!!:lol

yjmwxwx 发表于 2017-12-29 12:14:47

谢谢各位老师,我找到问题啦,原来是虚数计算的问题!

我小学文化没学过虚数计算:L

yjmwxwx 发表于 2017-12-29 12:47:55

本帖最后由 yjmwxwx 于 2017-12-29 12:57 编辑

我说怎么不能理解(0.707+0.707i)×(1.414+1.414i)=1.999i呢,原来根本没学过。

早知道也好好上上学啦,我上初中就没听过课课桌里全是垃圾没书。


yjmwxwx 发表于 2017-12-30 00:37:14

又改了下,这次没问题了,谢谢各位老师指导,终于把书里的计算方法写成了程序,虽然写的很烂,但是零基础学个东西不容易。



#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);


}

cuiningkun 发表于 2017-12-31 22:51:25

看着头都大了,找到就好了。。。

onetty 发表于 2018-1-1 20:02:36

慢慢琢磨吧,这个得循序渐进。

袁国钟 发表于 2018-1-6 02:21:32

C语言太麻烦,不好学呀


呵呵,如果用汇编,可能想都不要想了。C语言只是一些计算公式,只要公式对了,数据类型对了基本就差不多了。我这里说句多余的,有些人把C言看的太那个了,我也说不清了,就像楼主就是一个,我看过他好多帖子,只是在装没知识,其实我也不知道,呵呵,楼主回答一下吧
页: [1] 2
查看完整版本: 也学C语言,写了个程序有点问题