xiaoaf 发表于 2014-4-1 14:44:14

为什么使用stc12c5a60s2 乘除法运算出现大误差?

本帖最后由 xiaoaf 于 2014-4-1 14:45 编辑

情况是这样的, 手头有个3字节的 整数
字节高位rtemp0=0x50;
字节中rtemp1=0xc2;
字节地位rtemp2=0x72;
temp=(rtemp0<<8)+rtemp1;
temp=(temp<<8)+rtemp2;
也就是说理论上temp=5292658;
再拿出一个整形数 unsigned int num;
经过运算num=temp/10000=5292658/10000=522;实际应该是等于529这样才对吧!
为什么会偏差那么大 求解!

lcw_swust 发表于 2014-4-1 14:51:37

有完整的程序么

xiaoaf 发表于 2014-4-1 16:12:23

本帖最后由 xiaoaf 于 2014-4-1 16:19 编辑

lcw_swust 发表于 2014-4-1 14:51
有完整的程序么

        程序如下
       
        char rtemp0=0,rtemp1=0,rtemp2=0;
        unsigned long Irms=0;
        cs5460_wbyte(0X16);//读电流值
        rtemp0=cs5460_rbyte();//读出所测数据       
        rtemp1=cs5460_rbyte();//读出所测数据
        rtemp2=cs5460_rbyte();//读出所测数据
                       
       USART_TX(0xff);
        USART_TX(rtemp0);//这一段是用来把读到的数据送到串口传给上位机看的,
        USART_TX(rtemp1);
        USART_TX(rtemp2);
        USART_TX(0xfe);
        {Irms=(rtemp0<<8)+rtemp1; //参与运算的就这三条语句
        Irms=(Irms<<8);
      int_ascii(((uint)Irms/10000));}// 问题就出在这里 我只要取出高3位 我通过上位机读出来 3个字节的值 0x50c272 =5292658
                                                                                                                                                                但是显示出来的却是 522   应该是529 才对

        {Irms=(rtemp0<<8)+rtemp1;
        int_ascii(((uint)Irms*0.0256));} //因为只要取高3位 我用这个方法计算也是一样的问题


void int_ascii(int int_num)//将要显示的数转换后显示出来
{
        int mid_mun;
        mid_mun=int_num;
        if(mid_mun<0)
                {
                        mid_mun=0-mid_mun;
                }
        if(int_num<=-100)
                {
                        ASCII_num=10;
                        mid_mun=mid_mun%1000;
                        ASCII_num=(unsigned char)(mid_mun/100);
                        mid_mun=mid_mun%100;
                        ASCII_num=(unsigned char)(mid_mun/10);
                }
        else if(int_num<=-10)
                {
                        ASCII_num=15;
                        mid_mun=mid_mun%1000;
                        ASCII_num=10;
                        mid_mun=mid_mun%100;
                        ASCII_num=(unsigned char)(mid_mun/10);
                }
        else if(int_num<0)
                {
                        ASCII_num=15;
                        mid_mun=mid_mun%1000;
                        ASCII_num=15;
                        mid_mun=mid_mun%100;
                        ASCII_num=10;
                       
                }
        else if(int_num>=1000)
                {
                        ASCII_num=(unsigned char)(mid_mun/1000);
                        mid_mun=mid_mun%1000;
                        ASCII_num=(unsigned char)(mid_mun/100);
                        mid_mun=mid_mun%100;
                        ASCII_num=(unsigned char)(mid_mun/10);

                }
        else if(int_num>=100)
                {
                        ASCII_num=15;
                        mid_mun=mid_mun%1000;
                        ASCII_num=(unsigned char)(mid_mun/100);
                        mid_mun=mid_mun%100;
                        ASCII_num=(unsigned char)(mid_mun/10);

                }
        else if(int_num>=10)
                {
                        ASCII_num=15;
                        mid_mun=mid_mun%1000;
                        ASCII_num=15;
                        mid_mun=mid_mun%100;
                        ASCII_num=(unsigned char)(mid_mun/10);

                }
        else if(int_num>=0)
                                {
                        ASCII_num=15;
                        mid_mun=mid_mun%1000;
                        ASCII_num=15;
                        mid_mun=mid_mun%100;
                        ASCII_num=15;
                }
        ASCII_num=(unsigned char)(mid_mun%10);
                for(mid_mun=0;mid_mun<4;mid_mun++)
                        display(mid_mun,ASCII_num);//i位选 num 内容 0-9 - E H L P
}

fzkqi 发表于 2014-4-1 16:18:00

(rtemp0<<8) 注意类型转换,char型右移8位变啥了啊。

xiaoaf 发表于 2014-4-1 16:22:52

fzkqi 发表于 2014-4-1 16:18
(rtemp0

哇 大神一语道破天机 果然是这里出问题了,改成 unsinged char就解决了   十分感谢!!!!!

lcw_swust 发表于 2014-4-1 16:23:04

xiaoaf 发表于 2014-4-1 16:12
程序如下
       
        char rtemp0=0,rtemp1=0,rtemp2=0;


看来楼主对数据类型不够了解呀.
建议做以下改动:
char rtemp0...... 改为 unsigned char rtemp0......
Irms=(rtemp0<<8)+rtemp1; 改为 Irms=((unsigned int)rtemp0<<8)+rtemp1;
nt_ascii(((uint)Irms/10000)); 改为 nt_ascii((uint)(Irms/10000)); 或者 nt_ascii(Irms/10000);

xiaoaf 发表于 2014-4-1 16:23:54

lcw_swust 发表于 2014-4-1 14:51
有完整的程序么

问题已解决 ,就是 rtemp 这 个类型吧char 改 uchar 就好了 谢谢!

xiaoaf 发表于 2014-4-1 16:25:30

lcw_swust 发表于 2014-4-1 16:23
看来楼主对数据类型不够了解呀.
建议做以下改动:
char rtemp0...... 改为 unsigned char rtemp0......


嗯嗯,解决了,一时没注意到这个问题唉唉,就说怎么会差那么多,

lcw_swust 发表于 2014-4-1 16:26:50

xiaoaf 发表于 2014-4-1 16:23
问题已解决 ,就是 rtemp 这 个类型吧char 改 uchar 就好了 谢谢!

呵呵,楼主不妨多试几组数据

xiaoaf 发表于 2014-4-1 16:35:42

lcw_swust 发表于 2014-4-1 16:26
呵呵,楼主不妨多试几组数据

试了,已经是没有问题了, 看来以后这个类型确实要 看清楚了, 搞了我一个下午了呵呵

lukefan2008 发表于 2014-4-1 17:12:09

看来我自己平时也得多注意些这些具体的细节
页: [1]
查看完整版本: 为什么使用stc12c5a60s2 乘除法运算出现大误差?