矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 7954|回复: 19

也学C语言,写了个程序有点问题

[复制链接]
     
发表于 2017-12-27 04:55:30 | 显示全部楼层 |阅读模式

原书里面的一段 ch04.html.zip (19.34 KB, 下载次数: 73)



输入

截图_2017-12-27_04-40-56.png

截图_2017-12-27_04-32-40.png

截图_2017-12-27_04-41-25.png

截图_2017-12-27_04-41-54.png

结果

截图_2017-12-27_04-47-01.png


网页版计算器
截图_2017-12-27_04-33-14.png

程序写的有问题和网页版对应不起来,请问各位老师哪里有问题呢?

  1. #include <stdio.h>
  2. void main() {
  3.   float shurur [] = {0.3535,0.3535,0.6464,1.0607,0.3535,-1.0607,-1.3535,-0.3535};
  4.   float shurui [] = {0,0,0,0,0,0,0,0};
  5.   float shuchur[8];
  6.   float shuchui[8];
  7.   float b0r,b0i,b1r,b1i,b2r,b2i,b3r,b3i,b4r,b4i,b5r,b5i,b6r,b6i,b7r,b7i;
  8.   float d0r,d0i,d1r,d1i,d2r,d2i,d3r,d3i,d4r,d4i,d5r,d5i,d6r,d6i,d7r,d7i;
  9.   float c5r,c5i,c7r,c7i;

  10.       /*一*/
  11.        b0r=shurur[0]+shurur[4];
  12.        b0i=shurui[0]+shurui[4];
  13.        b4r=shurur[0]-shurur[4];
  14.        b4i=shurui[0]-shurui[4];
  15.        b2r=shurur[2]+shurur[6];
  16.        b2i=shurui[2]+shurui[6];
  17.        b6r=shurur[2]-shurur[6];
  18.        b6i=shurui[2]-shurui[6];
  19.        b1r=shurur[1]+shurur[5];
  20.        b1i=shurui[1]+shurui[5];
  21.        b5r=shurur[1]-shurur[5];
  22.        b5i=shurui[1]-shurui[5];
  23.        b3r=shurur[3]+shurur[7];
  24.        b3i=shurui[3]+shurui[7];
  25.        b7r=shurur[3]-shurur[7];
  26.        b7i=shurui[3]-shurui[7];

  27.        /*二*/
  28.        d0r=b0r+b2r;
  29.        d0i=b0i+b2i;
  30.        d2r=b0r-b2r;
  31.        d2i=b0i-b2i;
  32.       
  33.        d6i=b6r;
  34.        d4i=b4i+d6i;
  35.        d4r=b4r;
  36.        d6r=b4r;

  37.        d1r=b1r+b3r;
  38.        d1i=b1i+b3i;
  39.        d3r=b1r-b3r;
  40.        d3i=b1i-b3i;

  41.        d5r=b5r;
  42.        d5i=b7r;
  43.        d7r=b5r;
  44.        d7i=d7r;
  45.    
  46.       
  47.        /*三*/
  48.        shuchur[0]=d0r+d1r;
  49.        shuchui[0]=d0i-d1i;

  50.        shuchur[1]=d4r;
  51.        d5i=1.414*d5r;
  52.        shuchui[1]=d4i+d5i;

  53.        shuchur[2]=d2r;
  54.        shuchui[2]=d2i+d3r;


  55.        shuchur[3]=d6r;
  56.        d7i=-1.414*d7r;
  57.        shuchui[3]=d6i+d7i;
  58.        shuchur[3]=d6r;
  59.       
  60.        d5i=d5r*1.414;
  61.        shuchur[5]=d4r;
  62.        shuchui[5]=d4i-d5i;

  63.        shuchur[4]=d0r-d1r;
  64.        shuchui[4]=d0i-d1i;


  65.        shuchur[6]=d2r;
  66.        shuchui[6]=d3r;

  67.        shuchur[7]=d6r;
  68.        shuchui[7]=d6i-d7i;
  69.       
  70.        printf("%f   %f\n",shuchur[0],shuchui[0]);
  71.        printf("%f   %f\n",shuchur[1],shuchui[1]);
  72.        printf("%f   %f\n",shuchur[2],shuchui[2]);
  73.        printf("%f   %f\n",shuchur[3],shuchui[3]);
  74.        printf("%f   %f\n",shuchur[4],shuchui[4]);
  75.        printf("%f   %f\n",shuchur[5],shuchui[5]);
  76.        printf("%f   %f\n",shuchur[6],shuchui[6]);
  77.        printf("%f   %f\n",shuchur[7],shuchui[7]);


  78. }
复制代码


     
发表于 2017-12-27 10:45:46 | 显示全部楼层
是对得上的啊,只是精度不够,两者的计算误差不一样而已。你改用double精度可以提高一倍。如果要更高精度的结果,某些编译器可以支持long double。能支持80位或更长的浮点数。
回复 支持 反对

使用道具 举报

     
发表于 2017-12-27 15:22:02 | 显示全部楼层
建议你边看C语言书边看别人写的代码, 看懂了再自己写.
回复 支持 反对

使用道具 举报

     
发表于 2017-12-27 15:47:05 | 显示全部楼层
C语言太麻烦,不好学呀
回复 支持 反对

使用道具 举报

     
发表于 2017-12-27 20:03:13 | 显示全部楼层
感觉好多人研究fft
回复 支持 反对

使用道具 举报

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

错误找到了,后面两步分写错了,没乘-1
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2017-12-28 13:01:58 | 显示全部楼层
本帖最后由 yjmwxwx 于 2017-12-28 13:05 编辑

这书里怎么不给个范例,自己写这么简单的几行代码都写不对,我又改了改,各位老师麻烦再给看看

截图_2017-12-28_12-57-26.png


截图_2017-12-28_12-56-40.png

  1. #include <stdio.h>
  2. void main() {
  3.   float shurur[] = {0.3535,0.3535,0.6464,1.0607,0.3535,-1.0607,-1.3535,-0.3535};
  4.   float b0r,b0i,b1r,b1i,b2r,b2i,b3r,b3i,b4r,b4i,b5r,b5i,b6r,b6i,b7r,b7i;
  5.   float d0r,d1r,d2r,d3r,d4r,d5r,d6r,d7r;
  6.   float d0i,d1i,d2i,d3i,d4i,d5i,d6i,d7i;
  7.   float c0r,c1r,c2r,c3r,c4r,c5r,c6r,c7r,c0i,c1i,c2i,c3i,c4i,c5i,c6i,c7i;
  8.       /*一*/
  9.        b0r=shurur[0]+shurur[4];
  10.        b4r=shurur[0]-shurur[4];
  11.        b2r=shurur[2]+shurur[6];
  12.        b6r=shurur[2]-shurur[6];
  13.        b1r=shurur[1]+shurur[5];
  14.        b5r=shurur[1]-shurur[5];
  15.        b3r=shurur[3]+shurur[7];
  16.        b7r=shurur[3]-shurur[7];

  17.        /*二*/
  18.           d0r=b0r+b2r;
  19.           d0i=0;
  20.           d2r=b0r-b2r;
  21.           d2i=0;

  22.           b6i=b6r*(-1);
  23.           b4i=0;
  24.           d4i=b4i+b6i;
  25.           d4r=b4r;
  26.           d6r=b4r;
  27.           d6i=b4i-b6i;

  28.           d1r=b1r+b3r;
  29.           d1i=0;
  30.           d3r=b1r-b3r;
  31.           d3i=0;

  32.           b7i=b7r*(-1);
  33.           d5i=b4i+b7i;
  34.           d5r=b7r;
  35.           d7r=b5r;
  36.           d7i=b4i-b7i;
  37.       
  38.        /*三*/
  39.           c0r=d0r+d1r;
  40.           c0i=d0i;
  41.           c4r=d0r-d1r;
  42.           c4i=d1i;

  43.           d5i=d5r*1.414;
  44.           c1r=d4r;
  45.           c5i=d4i+d5i;
  46.           c5r=d4r;
  47.           c1i=d4i-d5i;

  48.           d3i=d3r*(-1);
  49.           c2r=d2r;
  50.           c2i=d2i+d3i;
  51.           c6i=d2i-d3i;
  52.           c6r=d2r;

  53.           d7i=d7r*(-1.4147);
  54.           c3r=d6r;
  55.           c3i=d6i+d7i;
  56.           c7r=d6r;
  57.           c7i=d6i-d7i;
  58.           

  59.               
  60.        printf("%f         %f \n",c0r,c0i);
  61.        printf("%f         %f \n",c1r,c1i);
  62.        printf("%f         %f \n",c2r,c2i);
  63.        printf("%f         %f \n",c3r,c3i);
  64.        printf("%f         %f \n",c4r,c4i);
  65.        printf("%f         %f \n",c5r,c5i);
  66.        printf("%f         %f \n",c6r,c6i);
  67.        printf("%f         %f \n",c7r,c7i);


  68. }
复制代码



里面还有错误,但是不知道为什么结果对了
回复 支持 反对

使用道具 举报

     
发表于 2017-12-28 22:04:56 | 显示全部楼层
这是算法呀,,前辈直接在c上搞呀,,感觉好痛苦。
回复 支持 反对

使用道具 举报

     
发表于 2017-12-29 11:46:46 | 显示全部楼层
没有拿来就能用的程序!!
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2017-12-29 12:14:47 | 显示全部楼层
谢谢各位老师,我找到问题啦,原来是虚数计算的问题!

我小学文化没学过虚数计算
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2017-12-29 12:47:55 | 显示全部楼层
本帖最后由 yjmwxwx 于 2017-12-29 12:57 编辑

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

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


截图_2017-12-29_12-56-17.png
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2017-12-30 00:37:14 | 显示全部楼层
又改了下,这次没问题了,谢谢各位老师指导,终于把书里的计算方法写成了程序,虽然写的很烂,但是零基础学个东西不容易。

截图_2017-12-30_00-27-14.png

  1. #include<stdio.h>
  2. void main() {
  3.   float shurur[] = {0.3535,0.3535,0.6464,1.0607,0.3535,-1.0607,-1.3535,-0.3535};
  4.   float sr, si,ac,bd,ad,bc;
  5.   float b0r,b0i,b1r,b1i,b2r,b2i,b3r,b3i,b4r,b4i,b5r,b5i,b6r,b6i,b7r,b7i;
  6.   float d0r,d1r,d2r,d3r,d4r,d5r,d6r,d7r;
  7.   float d0i,d1i,d2i,d3i,d4i,d5i,d6i,d7i;
  8.   float c0r,c1r,c2r,c3r,c4r,c5r,c6r,c7r,c0i,c1i,c2i,c3i,c4i,c5i,c6i,c7i;
  9.       /*一*/
  10.        b0r=shurur[0]+shurur[4];
  11.        b4r=shurur[0]-shurur[4];
  12.        b2r=shurur[2]+shurur[6];
  13.        b6r=shurur[2]-shurur[6];
  14.        b1r=shurur[1]+shurur[5];
  15.        b5r=shurur[1]-shurur[5];
  16.        b3r=shurur[3]+shurur[7];
  17.        b7r=shurur[3]-shurur[7];

  18.        /*二*/
  19.        d0r=b0r+b2r;
  20.        d0i=0;
  21.        d2r=b0r-b2r;
  22.        d2i=0;


  23.        b4i=0;
  24.        b6i=0;
  25.        sr=0;
  26.        si=-1;
  27.        ac=b6r*sr;
  28.        bd=b6i*si;
  29.        ad=b6i*sr;
  30.        bc=b6r*si;
  31.        b6r=ac-bd;
  32.        b6i=ad+bc;
  33.        d4r=b4r+b6r;
  34.        d4i=b4i+b6i;
  35.        d6r=b4r-b6r;
  36.        d6i=b4i-b6i;

  37.        d1r=b1r+b3r;
  38.        d1i=0;
  39.        d3r=b1r-b3r;
  40.        d3i=0;


  41.        b6i=0;
  42.        b7i=0;
  43.        sr=0;
  44.        si=-1;
  45.        ac=b7r*sr;
  46.        bd=b7i*si;
  47.        ad=b7i*sr;
  48.        bc=b7r*si;
  49.        b7r=ac-bd;
  50.        b7i=ad+bc;
  51.        d5r=b5r+b7r;
  52.        d5i=b5i+b7i;
  53.        d7r=b5r-b7r;
  54.        d7i=b5i-b7i;

  55.       
  56.        /*三*/
  57.          
  58.          
  59.           c0r=d0r+d1r;
  60.           c0i=d0i+d1i;
  61.           c4r=d0r-d1r;
  62.           c4i=d0i-d1i;

  63.          
  64.           sr=0.7071;
  65.           si=-0.7071;
  66.           ac=d5r*sr;
  67.           bd=d5i*si;
  68.           ad=d5i*sr;
  69.           bc=d5r*si;
  70.           d5r=ac-bd;
  71.           d5i=ad+bc;
  72.           c1r=d4r+d5r;
  73.           c1i=d4i+d5i;
  74.           c5r=d4r-d5r;
  75.           c5i=d4i-d5i;

  76.           sr=0;
  77.           si=-1;
  78.           ac=d3r*sr;
  79.           bd=d3i*si;
  80.           ad=d3i*sr;
  81.           bc=d3r*si;
  82.           d3r=ac-bd;
  83.           d3i=ad+bc;
  84.           c2r=d2r+d3r;
  85.           c2i=d2i+d3i;
  86.           c6r=d2r-d3r;
  87.           c6i=d2i-d3i;

  88.           sr=-0.7071;
  89.           si=-0.7071;
  90.           ac=d7r*sr;
  91.           bd=d7i*si;
  92.           ad=d7i*sr;
  93.           bc=d7r*si;
  94.           d7r=ac-bd;
  95.           d7i=ad+bc;
  96.           c3r=d6r+d7r;
  97.           c3i=d6i+d7i;
  98.           c7r=d6r-d7r;
  99.           c7i=d6i-d7i;
  100.               
  101.        printf("%f         %f \n",c0r,c0i);
  102.        printf("%f         %f \n",c1r,c1i);
  103.        printf("%f         %f \n",c2r,c2i);
  104.        printf("%f         %f \n",c3r,c3i);
  105.        printf("%f         %f \n",c4r,c4i);
  106.        printf("%f         %f \n",c5r,c5i);
  107.        printf("%f         %f \n",c6r,c6i);
  108.        printf("%f         %f \n",c7r,c7i);


  109. }
复制代码
回复 支持 反对

使用道具 举报

     
发表于 2017-12-31 22:51:25 | 显示全部楼层
看着头都大了,找到就好了。。。
回复 支持 反对

使用道具 举报

     
发表于 2018-1-1 20:02:36 | 显示全部楼层
慢慢琢磨吧,这个得循序渐进。
回复 支持 反对

使用道具 举报

     
发表于 2018-1-6 02:21:32 | 显示全部楼层
C语言太麻烦,不好学呀


呵呵,如果用汇编,可能想都不要想了。C语言只是一些计算公式,只要公式对了,数据类型对了基本就差不多了。我这里说句多余的,有些人把C言看的太那个了,我也说不清了,就像楼主就是一个,我看过他好多帖子,只是在装没知识,其实我也不知道,呵呵,楼主回答一下吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-30 05:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表