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");
}
:shock:x^2 + x = 0 一直在解:sad register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度。例如下面的内存块拷贝代码,
如果 可能
首先,register变量必须是能被CPU所接受的类型。这通常意味着register变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。不过,有些机器的寄存器也能存放浮点数。
迷雾少年 发表于 2015-5-16 21:22
x^2 + x = 0 一直在解
不出意外这个一分钟能解出来的,还有,这么说寄存器用不上了,不知道有没有别的办法,人家几何画板都是秒解的(高中生学习神器) 大兄弟,首先你应该知道寄存器里面没有“类型”(或者说汇编中)这一说法,也就是说,寄存器神马的,包括内存在汇编语言下看到的都是几个字节的内容,就拿32位操作系统说一下,long占4个字节,double占8个字节,但是32位寄存器只有四个字节,所以double就不能放在寄存器中,但是long可以,顺便说一下你可能会产生的疑问,应用程序怎么分别是整形的还是long型的,那就是,这4个字节数据就放在这个地方,看你的cpu想拿他当什么处理了 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时说明有两个根(选自初中教材某个章节) 刚发的
http://bbs.fishc.com/thread-61225-1-1.html 海血冰_-128℃ 发表于 2015-5-16 22:05
对于这种求根的系统,并不是用到循环穷尽的方法,而是用到公式,比如你说的 ax^2 + bx + c =0这种式子, ...
三次方四次方五次方有公式吗{:5_92:} 迷雾少年 发表于 2015-5-16 22:45
刚发的
http://bbs.fishc.com/thread-61225-1-1.html
你的程序时间是按秒来计算的吗?我的配置虽然比你高,但是20次方程大概也就5分钟。。 海血冰_-128℃ 发表于 2015-5-16 22:05
对于这种求根的系统,并不是用到循环穷尽的方法,而是用到公式,比如你说的 ax^2 + bx + c =0这种式子, ...
我并不认为几何画板这类软件是用公式来解的,他能画出任意函数图像,包括超越方程,就是说比如log x+x^2-3=0(函数和方程本来就是通的嘛),如果真有公式,估计会非常非常复杂。 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,再进行循环找出变号的两个数,以此类推,直到你要的精确度为止 迷雾少年 发表于 2015-5-16 22:46
三次方四次方五次方有公式吗
这个真不知道
页:
[1]