Prentis 发表于 2015-5-16 21:07:03

C语言register的问题

本帖最后由 Prentis 于 2015-5-16 21:48 编辑

看小甲鱼老师上课讲到,register寄存器可以大幅提高程序运行速度,这使我想到我前些天写的一个程序,万能解方程,可以解一元高次方程,算法很烂,所以运行很慢,用vs 2013会快一些但超十次的方程还是要好久好久(不知道是不是生成了64位程序),然而人家几何画板不管什么方程化为函数零点都是秒解的(高中生学习神器)。

那么问题来了,register仅仅支持整形吗?double就不能用吗,如果能用,这个程序的效率将会大大提高。附上程序源代码,vs 2013编译通过,运算精度不是很高。#include <math.h>
void main()
{
      int max, m;
      register i;
      double e, x, n, sum;
      printf("请输入方程最高次的次数:");
      scanf_s("%d", &max);
      sum = 0;
      m = 0;
      for (i = max; i>0; i--)
      {
                printf("请输入方程%d次项的系数:", i);
                scanf_s("%lf", &n);
      }
      printf("请输入方程的常数项:");
      scanf_s("%lf", &n);
      printf("本程序将执行很多次运算,请耐心等待,这可能需要一些时间。\n");
      for (x = -20; x<20; x = x + 0.0000001)
      {
                sum = 0;
                for (i = 1; i <= max; i++)
                {
                        e = pow(x, i);
                        sum = sum + n * e;
                }
                sum = sum + n;
                if ((sum >= -0.00001) && (sum <= 0.00001))
                {
                        printf("x=%lf是方程的一个解。\n", x);
                        m++;
                }
                if (m == max)
                {
                        break;
                }
      }
      if (m == 0)
      {
                printf("该方程无实数解。\n");
      }
      system("pause");
}






迷雾少年 发表于 2015-5-16 21:22:37

:shock:x^2 + x = 0      一直在解:sad

迷雾少年 发表于 2015-5-16 21:23:31

register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度。例如下面的内存块拷贝代码,
如果 可能


首先,register变量必须是能被CPU所接受的类型。这通常意味着register变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。不过,有些机器的寄存器也能存放浮点数。

Prentis 发表于 2015-5-16 21:47:25

迷雾少年 发表于 2015-5-16 21:22
x^2 + x = 0      一直在解

不出意外这个一分钟能解出来的,还有,这么说寄存器用不上了,不知道有没有别的办法,人家几何画板都是秒解的(高中生学习神器)

海血冰_-128℃ 发表于 2015-5-16 21:57:27

大兄弟,首先你应该知道寄存器里面没有“类型”(或者说汇编中)这一说法,也就是说,寄存器神马的,包括内存在汇编语言下看到的都是几个字节的内容,就拿32位操作系统说一下,long占4个字节,double占8个字节,但是32位寄存器只有四个字节,所以double就不能放在寄存器中,但是long可以,顺便说一下你可能会产生的疑问,应用程序怎么分别是整形的还是long型的,那就是,这4个字节数据就放在这个地方,看你的cpu想拿他当什么处理了

海血冰_-128℃ 发表于 2015-5-16 22:05:25

Prentis 发表于 2015-5-16 21:47
不出意外这个一分钟能解出来的,还有,这么说寄存器用不上了,不知道有没有别的办法,人家几何画板都是秒 ...

对于这种求根的系统,并不是用到循环穷尽的方法,而是用到公式,比如你说的 ax^2 + bx + c =0这种式子,它的根 x = (-b ± (b2 - 4ac)^(0.5))/2a   求出的值,分别为x1和x2当b2 - 4ac = 0时说明有一个根,当<0时说明没有根 当> 0时说明有两个根(选自初中教材某个章节)

迷雾少年 发表于 2015-5-16 22:45:45

刚发的
http://bbs.fishc.com/thread-61225-1-1.html

迷雾少年 发表于 2015-5-16 22:46:27

海血冰_-128℃ 发表于 2015-5-16 22:05
对于这种求根的系统,并不是用到循环穷尽的方法,而是用到公式,比如你说的 ax^2 + bx + c =0这种式子, ...

三次方四次方五次方有公式吗{:5_92:}

Prentis 发表于 2015-5-17 06:48:15

迷雾少年 发表于 2015-5-16 22:45
刚发的
http://bbs.fishc.com/thread-61225-1-1.html

你的程序时间是按秒来计算的吗?我的配置虽然比你高,但是20次方程大概也就5分钟。。

Prentis 发表于 2015-5-17 06:54:48

海血冰_-128℃ 发表于 2015-5-16 22:05
对于这种求根的系统,并不是用到循环穷尽的方法,而是用到公式,比如你说的 ax^2 + bx + c =0这种式子, ...

我并不认为几何画板这类软件是用公式来解的,他能画出任意函数图像,包括超越方程,就是说比如log x+x^2-3=0(函数和方程本来就是通的嘛),如果真有公式,估计会非常非常复杂。

海血冰_-128℃ 发表于 2015-5-17 10:28:11

Prentis 发表于 2015-5-17 06:54
我并不认为几何画板这类软件是用公式来解的,他能画出任意函数图像,包括超越方程,就是说比如log x+x^2- ...

首先你要明白,求根和绘图是两个概念,画出任意图像只不过是取X点,然后求Y的值,然后画出点的位置;求根是当Y=0的时候x的取值;再有就是算法问题,不可否认,有的方程求根确实是没有公式,不过,有精度这么一个说法,比如精确到0.01,不应该是每次数值增加0.01而是,每次数值都增加1,然后直到取到一个点结果Y的值变号了(由正数变为了负数,或者由负数变为了正数),然后将精确度提高比如取到两个点,当x=n1的时候 Y < 0,当x=n2的时候 Y > 0,其中n2 = n1 ± 1,这时候,将n1 ~ n2之间的小数取出 n1 + 0.1 ,n1 + 0.2 ......
一直到n2,再进行循环找出变号的两个数,以此类推,直到你要的精确度为止

海血冰_-128℃ 发表于 2015-5-17 10:29:33

迷雾少年 发表于 2015-5-16 22:46
三次方四次方五次方有公式吗

这个真不知道
页: [1]
查看完整版本: C语言register的问题