標題:
單片機計算數(shù)值過大,keil仿真精確度到不到小數(shù)點后兩位或三位。該怎么做?急求
[打印本頁]
作者:
153807564
時間:
2018-11-26 14:16
標題:
單片機計算數(shù)值過大,keil仿真精確度到不到小數(shù)點后兩位或三位。該怎么做?急求
返回值指針是double類型的數(shù)組也不能接受,后來改成long類型。數(shù)值都對了,但是精度達不到小數(shù)點后兩位或三位。
求大神將我怎么去掉高位數(shù)值,我需要小數(shù)點前4到5位,小數(shù)點后2到3位。拜托了。
單片機源碼:
void process(double a,double b,double z,double *back_sp)
{
double xdata a,b,c;
double xdata N1,M1,J1,G1,H1;
J1=B1-zwx_d;
J1*=0.0174532925199;
G1=J1*J1;
M1=A1*0.0174532925199;
H1=sin(M1);
M1=cos(M1);
N1=M1*M1;
a=(32144.5189-(135.3646-(0.7034-0.0041*N1)*N1)*N1);
b=(0.25+0.00253*N1)*N1;
b=b-0.04167;
c=0.167*N1-0.083;
c=c*N1;
c=c*G1;
c+=b;
c*=G1;
c+=0.5;
c*=G1;
b=108.996-0.603*N1;
b=b*N1;
b=21565.045-b;
b*=N1;
b=6399596.652-b;
b=b*c;
a=a-b;
back_sp[0]=111133.00468*A1-a*M1*H1;
a=0.001123*N1;
a+=0.3333333;
a*=N1;
a-=0.1666667;
b=0.1702-0.20382*N1;
b*=N1;
b=0.00878-b;
b*=G1;
a+=b;
a=a*G1;
a+=1;
a*=J1;
b=108.996-0.603*N1;
b*=M1;
b=21565.045-b;
b*=N1;
b=6399596.652-b;
back_sp[1]=500000+a*b*M1;
}
復制代碼
作者:
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