请教下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后面的点是什么讲究? adin=adin*192;
adin=adin*500./255;
对这两个感觉很无力 楼主,500/255=1.960784313725490196078431372549,当然与1.92不相等了 lcw_swust 发表于 2012-11-2 12:59 static/image/common/back.gif
楼主,500/255=1.960784313725490196078431372549,当然与1.92不相等了
原来是这样啊,谢谢。
那么500后面的点号是什么意思,我试过,去掉后结果就不对了。 小数点啊{:shocked:} 加个点,显式表示为浮点数,运算结果是浮点数。不加点就当整型处理了,没有小数部分的结果。 renwocai 发表于 2012-11-2 13:18 static/image/common/back.gif
原来是这样啊,谢谢。
那么500后面的点号是什么意思,我试过,去掉后结果就不对了。 ...
adin定义的是什么类型?
这样试试:
adin=(unsigned long)adin*500/255; 500是unsigned int整形,500.是float浮点型,一个是双字节的一个是四字节的,所以精度差了很多,浮点型的十进制数有7位有效数字。 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); 500. 就是 500.0,在 keil c 里,这个 . 后面是 0 可以不写,于是就出来了 500. 这个比较不好理解的数字了。 9楼的建议不错。。。
页:
[1]