找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2559|回复: 2
收起左侧

单片机计算数值过大,keil仿真精确度到不到小数点后两位或三位。该怎么做?急求

[复制链接]
ID:433410 发表于 2018-11-26 14:16 | 显示全部楼层 |阅读模式
返回值指针是double类型的数组也不能接受,后来改成long类型。数值都对了,但是精度达不到小数点后两位或三位。
求大神将我怎么去掉高位数值,我需要小数点前4到5位,小数点后2到3位。拜托了。

单片机源码:
  1. void process(double a,double b,double z,double *back_sp)
  2. {
  3.   double xdata a,b,c;
  4.   double xdata N1,M1,J1,G1,H1;
  5.   J1=B1-zwx_d;
  6.   J1*=0.0174532925199;
  7.   G1=J1*J1;

  8.   M1=A1*0.0174532925199;
  9.   H1=sin(M1);
  10.   M1=cos(M1);
  11.   N1=M1*M1;

  12.   a=(32144.5189-(135.3646-(0.7034-0.0041*N1)*N1)*N1);
  13.   b=(0.25+0.00253*N1)*N1;
  14.   b=b-0.04167;
  15.   c=0.167*N1-0.083;
  16.   c=c*N1;
  17.   c=c*G1;
  18.   c+=b;
  19.   c*=G1;
  20.   c+=0.5;
  21.   c*=G1;
  22.   b=108.996-0.603*N1;
  23.   b=b*N1;
  24.   b=21565.045-b;
  25.   b*=N1;
  26.   b=6399596.652-b;
  27.   b=b*c;
  28.   a=a-b;
  29.   back_sp[0]=111133.00468*A1-a*M1*H1;


  30.   a=0.001123*N1;
  31.   a+=0.3333333;
  32.   a*=N1;
  33.   a-=0.1666667;
  34.   b=0.1702-0.20382*N1;
  35.   b*=N1;
  36.   b=0.00878-b;
  37.   b*=G1;
  38.   a+=b;
  39.   a=a*G1;
  40.   a+=1;
  41.   a*=J1;
  42.   b=108.996-0.603*N1;
  43.   b*=M1;
  44.   b=21565.045-b;
  45.   b*=N1;
  46.   b=6399596.652-b;

  47.   back_sp[1]=500000+a*b*M1;
  48. }
复制代码



回复

使用道具 举报

ID:401564 发表于 2018-11-26 19:31 | 显示全部楼层
我不会C,但我知道单片机原理。
你这个数据太大了,而且还是浮点型的,但不管多少位的单片机,都没有浮点型这个数,本质上都是整形的二进制数,如果单片机本身没有乘法器的话,只要是超过单片机本身的位数的,除法全部用减法来进行,乘法全部用加法来进行
M1=A1*0.0174532925199,这个运算是这样进行的:先是用加法进行A1*174532925199,然后再去除以刚才去掉小数点用的倍数:1000000000000,对于溢出了long类型长度的,全部去掉,误差就产生在这了
你要是问我怎么解决,不好意思,不知道,我只会汇编,256以内的运算还行,超过了。。。。。
回复

使用道具 举报

ID:434015 发表于 2018-11-27 10:51 | 显示全部楼层
你这个是什么板子执行运算呢?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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