renwocai 发表于 2012-11-2 12:36:00

请教下KEIL C中数字后面跟的点号

在做ADC0808实验时用到的两种数据处理办法,一种是把得到的数值直接乘以192,然后分离万,千,百位,如下:                adin=adin*192;
                hangliexie(1,1,adin/1000/10);
                xieshuju('.');
                hangliexie(1,3,adin/1000%10);
                hangliexie(1,4,adin/100%10);结果误差较大,最大测量结果大概比实际值小0.09V左右。

另一种处理办法,把得到的数值乘以500./255(注意500后面有个点号),再分离千,百,十位,如下:        adin=adin*500./255;
                hangliexie(1,1,adin/100%10);
                xieshuju('.');
                hangliexie(1,3,adin/10%10);
                hangliexie(1,4,adin%10);结果误差很小,最大只比实际值小0.01V。


想请教下,这两种数据处理方式的不同在哪里,500后面的点是什么讲究?

yklstudent 发表于 2012-11-2 12:42:32

adin=adin*192;
adin=adin*500./255;
对这两个感觉很无力

lcw_swust 发表于 2012-11-2 12:59:30

楼主,500/255=1.960784313725490196078431372549,当然与1.92不相等了

renwocai 发表于 2012-11-2 13:18:53

lcw_swust 发表于 2012-11-2 12:59 static/image/common/back.gif
楼主,500/255=1.960784313725490196078431372549,当然与1.92不相等了

原来是这样啊,谢谢。

那么500后面的点号是什么意思,我试过,去掉后结果就不对了。

zpxa001 发表于 2012-11-2 13:28:42

小数点啊{:shocked:}

freefei 发表于 2012-11-2 13:39:09

加个点,显式表示为浮点数,运算结果是浮点数。不加点就当整型处理了,没有小数部分的结果。

lcw_swust 发表于 2012-11-2 13:42:20

renwocai 发表于 2012-11-2 13:18 static/image/common/back.gif
原来是这样啊,谢谢。

那么500后面的点号是什么意思,我试过,去掉后结果就不对了。 ...

adin定义的是什么类型?
这样试试:
adin=(unsigned long)adin*500/255;

5IDIANZI 发表于 2012-11-2 13:54:28

500是unsigned int整形,500.是float浮点型,一个是双字节的一个是四字节的,所以精度差了很多,浮点型的十进制数有7位有效数字。

eduhf_123 发表于 2012-11-2 14:33:14

LZ你应该是用的5V电压作为AD转换的基准吧?那么这样就应该是:Vout/5V = ADIN/256(注意这里是256而不是255)。
Vout
= (ADIN/256)*5
= ADIN*5/256

加了小数点后,编译器会生成浮点运算代码,得不偿失,乘以100后转换为定点运算,在保证运算精度的同时可以大幅度减小运算量:
Vout*100
= ADIN*500/256
= ADIN*(500/256)
= ADIN*((512-12)/256)
= ADIN*(2-12/256)
= ADIN*2-((ADIN*12)>>8)
实现方式:adin =adin*2 - ((adin*12)>>8);
hangliexie(1,1,adin/100);
xieshuju('.');
hangliexie(1,3,adin/10%10);
hangliexie(1,4,adin%10);

starsnow 发表于 2012-11-6 15:58:28

500. 就是 500.0,在 keil c 里,这个 . 后面是 0 可以不写,于是就出来了 500. 这个比较不好理解的数字了。

zjk 发表于 2012-11-6 20:21:29

9楼的建议不错。。。
页: [1]
查看完整版本: 请教下KEIL C中数字后面跟的点号