標題: 單片機計算數(shù)值過大,keil仿真精確度到不到小數(shù)點后兩位或三位。該怎么做?急求 [打印本頁]

作者: 153807564    時間: 2018-11-26 14:16
標題: 單片機計算數(shù)值過大,keil仿真精確度到不到小數(shù)點后兩位或三位。該怎么做?急求
返回值指針是double類型的數(shù)組也不能接受,后來改成long類型。數(shù)值都對了,但是精度達不到小數(shù)點后兩位或三位。
求大神將我怎么去掉高位數(shù)值,我需要小數(shù)點前4到5位,小數(shù)點后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. }
復制代碼




作者: Y_G_G    時間: 2018-11-26 19:31
我不會C,但我知道單片機原理。
你這個數(shù)據(jù)太大了,而且還是浮點型的,但不管多少位的單片機,都沒有浮點型這個數(shù),本質上都是整形的二進制數(shù),如果單片機本身沒有乘法器的話,只要是超過單片機本身的位數(shù)的,除法全部用減法來進行,乘法全部用加法來進行
M1=A1*0.0174532925199,這個運算是這樣進行的:先是用加法進行A1*174532925199,然后再去除以剛才去掉小數(shù)點用的倍數(shù):1000000000000,對于溢出了long類型長度的,全部去掉,誤差就產生在這了
你要是問我怎么解決,不好意思,不知道,我只會匯編,256以內的運算還行,超過了。。。。。
作者: 花板子    時間: 2018-11-27 10:51
你這個是什么板子執(zhí)行運算呢?




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1