鱼C论坛

 找回密码
 立即注册
查看: 2065|回复: 11

C语言register的问题

[复制链接]
发表于 2015-5-16 21:07:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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[99], sum;
        printf("请输入方程最高次的次数:");
        scanf_s("%d", &max);
        sum = 0;
        m = 0;
        for (i = max; i>0; i--)
        {
                printf("请输入方程%d次项的系数:", i);
                scanf_s("%lf", &n[i]);
        }
        printf("请输入方程的常数项:");
        scanf_s("%lf", &n[0]);
        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[i] * e;
                }
                sum = sum + n[0];
                if ((sum >= -0.00001) && (sum <= 0.00001))
                {
                        printf("x=%lf是方程的一个解。\n", x);
                        m++;
                }
                if (m == max)
                {
                        break;
                }
        }
        if (m == 0)
        {
                printf("该方程无实数解。\n");
        }
        system("pause");
}





想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-5-16 21:22:37 | 显示全部楼层
:shock:  x^2 + x = 0      一直在解  :sad  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-16 21:23:31 | 显示全部楼层
register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度。例如下面的内存块拷贝代码,
如果 可能


首先,register变量必须是能被CPU所接受的类型。这通常意味着register变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。不过,有些机器的寄存器也能存放浮点数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-16 21:47:25 | 显示全部楼层
迷雾少年 发表于 2015-5-16 21:22
x^2 + x = 0      一直在解

不出意外这个一分钟能解出来的,还有,这么说寄存器用不上了,不知道有没有别的办法,人家几何画板都是秒解的(高中生学习神器)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-16 21:57:27 | 显示全部楼层
大兄弟,首先你应该知道寄存器里面没有“类型”(或者说汇编中)这一说法,也就是说,寄存器神马的,包括内存在汇编语言下看到的都是几个字节的内容,就拿32位操作系统说一下,long占4个字节,double占8个字节,但是32位寄存器只有四个字节,所以double就不能放在寄存器中,但是long可以,顺便说一下你可能会产生的疑问,应用程序怎么分别是整形的还是long型的,那就是,这4个字节数据就放在这个地方,看你的cpu想拿他当什么处理了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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时说明有两个根(选自初中教材某个章节)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-16 22:45:45 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

三次方四次方五次方有公式吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-17 06:48:15 | 显示全部楼层
迷雾少年 发表于 2015-5-16 22:45
刚发的
http://bbs.fishc.com/thread-61225-1-1.html

你的程序时间是按秒来计算的吗?我的配置虽然比你高,但是20次方程大概也就5分钟。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我并不认为几何画板这类软件是用公式来解的,他能画出任意函数图像,包括超越方程,就是说比如log x+x^2-3=0(函数和方程本来就是通的嘛),如果真有公式,估计会非常非常复杂。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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,再进行循环找出变号的两个数,以此类推,直到你要的精确度为止
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-17 10:29:33 | 显示全部楼层
迷雾少年 发表于 2015-5-16 22:46
三次方四次方五次方有公式吗

这个真不知道
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 23:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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