近來工作中發(fā)現(xiàn)了一種浮點(diǎn)數(shù)運(yùn)算的近似算法,也不知道前人有沒有這樣應(yīng)用過,反正自己到目前還沒見過,就暫且稱作自己發(fā)現(xiàn)的。如有類同,純屬巧合。本算法對(duì)嵌入式編程的人有很大用處,其他領(lǐng)域就不知道了,F(xiàn)整理如下,希望對(duì)需要的人有所幫助。 -
大家都知道,乘法相對(duì)好運(yùn)算些,也有現(xiàn)成的公式可以分解、簡(jiǎn)化,使其運(yùn)算簡(jiǎn)單符合自己的要求,但除法有時(shí)卻找不到什么公式可以把它分解的符合自己的要求,特別是對(duì)做8位機(jī)編程的人,浮點(diǎn)數(shù)運(yùn)算很占空間又影響執(zhí)行速度,所以一般都需要化成整數(shù)進(jìn)行運(yùn)算
舉例如下:
10位AD采集,最大值是1023,如果需要利用AD采集結(jié)果對(duì)輸出進(jìn)行連續(xù)控制,就需要對(duì)AD進(jìn)行細(xì)分,假設(shè)細(xì)分500份,那么每份就是1023/500=2.046,假如只取整數(shù)部分,則最大值時(shí)會(huì)有較大誤差,假如用浮點(diǎn)數(shù)則輸出 =
實(shí)際值/2.046,但8位MCU不喜歡浮點(diǎn)數(shù),那么此時(shí)就要換一種方法,如下:
1.把最大值分為可被細(xì)分?jǐn)?shù)整除的整數(shù)部分+小數(shù)部分,如被500除1023可分為1000+23;被300除可分為900+123;
2.把能被整除的整數(shù)部分除以除數(shù)得出最小細(xì)分整數(shù)部分,如1000/500=2;900/300=3;
3.把實(shí)測(cè)數(shù)除以最小細(xì)分?jǐn)?shù)得得出修正前的整數(shù);
4.把修正前的整數(shù)乘以步驟1中的尾數(shù)部分再除以滿刻度值,得出修正數(shù),把修正前的數(shù)減去修正數(shù)得出最終所需倍數(shù),既所需要的結(jié)果;另外滿刻度值最好是根據(jù)實(shí)際取一定的舍取值。例如,如果10位AD可取1000(其實(shí)取滿刻度值應(yīng)該除以1023,至于取1000是為了使偏差減小,不至于使輸出結(jié)果超調(diào)),如果是8位AD可取250(其滿刻度值是255,取250也是為了在采集值快達(dá)到滿刻度值時(shí)防止輸出結(jié)果超調(diào),當(dāng)然直接使用滿刻度值也是可以的,為了防止超調(diào)要對(duì)輸出結(jié)果做一個(gè)限幅).
例如1:對(duì)10位AD,滿刻度1023分成500份,1023可分成1000+23,令z=1023/500=2.046,假設(shè)當(dāng)前實(shí)測(cè)值x是635,那么此實(shí)測(cè)值x對(duì)應(yīng)的輸出值應(yīng)是y=x/2.046=635/2.046=310,假如MCU不采用浮點(diǎn)數(shù),z=1023/500=2,那么MCU算出的輸出值是y=x/2=635/2=317,比實(shí)際值大了7個(gè)點(diǎn);按照上面的公式,把y乘以尾數(shù)23除以1000得出修正數(shù)w=y(tǒng)×23/1000=317×23/1000=7,按照步驟5把y減去修正數(shù)即得出與實(shí)際沒有誤差的結(jié)果y-w=317-7=310;
例如2:對(duì)于8位AD,滿刻度255分成100份,255可分成200+55,令z=255/100=2.55,假設(shè)當(dāng)前實(shí)測(cè)值x是226,那么此實(shí)測(cè)值x對(duì)應(yīng)的輸出值應(yīng)是y=x/2.55=226/2.55=88,假如MCU不采用浮點(diǎn)數(shù),z=255/100=2,那么MCU算出的輸出值是y=x/2=226/2=113,比實(shí)際值大了25個(gè)點(diǎn);按照上面的公式,把y乘以尾數(shù)55除以250得出修正數(shù)w=y(tǒng)×55/250=113×55/250=24,按照步驟5把y減去修正數(shù)即得出與實(shí)際沒有誤差的結(jié)果y-w=113-24=89 ,與88只差一個(gè)點(diǎn);假設(shè)當(dāng)前實(shí)測(cè)值x是滿刻度值255,那么此實(shí)測(cè)值x對(duì)應(yīng)的輸出值應(yīng)是y=x/2.55=255/2.55=100,假如MCU不采用浮點(diǎn)數(shù),z=255/100=2,那么MCU算出的輸出值是y=x/2=255/2=127,比實(shí)際值大了27個(gè)點(diǎn);按照上面的公式,把y乘以尾數(shù)55除以250得出修正數(shù)w=y(tǒng)×55/250=127×55/250=27,按照步驟5把y減去修正數(shù)即得出與實(shí)際沒有誤差的結(jié)果y-w=127-17=100 ,沒有誤差不會(huì)超調(diào)。 如有異議請(qǐng)指正。以上純屬個(gè)人經(jīng)驗(yàn),對(duì)套用出錯(cuò)者不負(fù)任何責(zé)任,如若轉(zhuǎn)載請(qǐng)注明出處!
|