有這么一個(gè)
計(jì)算公式:
PHA_adj=65536-18919*(T_Pimp-time_cnt)/time_cnt;
其中:
PHA_adj:unsignedint
T_Pimp:常數(shù),等于3266
time_cnt:unsignedint范圍在2000至3000之間
這個(gè)公式有錯(cuò)嗎,如果錯(cuò)了錯(cuò)在哪?怎么改才能算出期望值?
(KEILC518位機(jī)等同于8052)PHA_adj結(jié)果精度需保證在0.1%內(nèi)
呵呵答案在后面給出.
網(wǎng)友評(píng)論:分開之后發(fā)覺,那個(gè)INT×INT后,INT是放不下結(jié)果的。
網(wǎng)友評(píng)論:直接開長(zhǎng)整型數(shù)據(jù)定義
網(wǎng)友評(píng)論:PHA_adj=~((unsignedlong)18919*(T_Pimp-time_cnt)/time_cnt)+1;
不如:
PHA_adj=65536-(unsignedlong)18919*(T_Pimp-time_cnt)/time_cnt;好
為什么呢,什么原因呢
網(wǎng)友評(píng)論:很煩強(qiáng)制轉(zhuǎn)換,那玩意很多時(shí)候是個(gè)隱性炸彈。。。
直接開長(zhǎng)整型數(shù)據(jù)定義
答:直接開長(zhǎng)整型定義會(huì)帶來如下后果:
占用數(shù)據(jù)存儲(chǔ)器多,代碼長(zhǎng),執(zhí)行時(shí)間長(zhǎng).
28樓:樓主所說的好是什么方面的??
25樓:
PHA_adj=~((unsignedlong)18919*(T_Pimp-time_cnt)/time_cnt)+1;
不如:
PHA_adj=65536-(unsignedlong)18919*(T_Pimp-time_cnt)/time_cnt;好
為什么呢,什么原因呢
答:PHA_adj=65536-(unsignedlong)18919*(T_Pimp-time_cnt)/time_cnt;代碼比較少一點(diǎn).
網(wǎng)友評(píng)論:答樓上兩位
27樓:很煩強(qiáng)制轉(zhuǎn)換,那玩意很多時(shí)候是個(gè)隱性炸彈。。。
直接開長(zhǎng)整型數(shù)據(jù)定義
答:直接開長(zhǎng)整型定義會(huì)帶來如下后果:
占用數(shù)據(jù)存儲(chǔ)器多,代碼長(zhǎng),執(zhí)行時(shí)間長(zhǎng).
-------------------------------------------------------------
且,你以為你沒開長(zhǎng)整型,代碼就短了?執(zhí)行時(shí)間就短了?至于占用RAM多的問題,你開成局部變量就是了,用完自動(dòng)被編譯器釋放了。
網(wǎng)友評(píng)論:且。。。
xuehongren發(fā)表于2008-10-2410:43侃單片機(jī)←返回版面
29樓:答樓上兩位
27樓:很煩強(qiáng)制轉(zhuǎn)換,那玩意很多時(shí)候是個(gè)隱性炸彈。。。
直接開長(zhǎng)整型數(shù)據(jù)定義
答:直接開長(zhǎng)整型定義會(huì)帶來如下后果:
占用數(shù)據(jù)存儲(chǔ)器多,代碼長(zhǎng),執(zhí)行時(shí)間長(zhǎng).
-------------------------------------------------------------
且,你以為你沒開長(zhǎng)整型,代碼就短了?執(zhí)行時(shí)間就短了?至于占用RAM多的問題,你開成局部變量就是了,用完自動(dòng)被編譯器釋放了。
沒必要得整成長(zhǎng)整型吧,照你這么說,那只要牽扯到LONGINT的都定義成LONGINT?
至于你說的隱性炸彈應(yīng)該是可以避免的
網(wǎng)友評(píng)論:(unsignedlong)18919=18919L
65536-x=取補(bǔ)碼(~x)+1,且不牽涉進(jìn)位。
17L前面的65536沒加L或(unsignedlong)
剛才試了下,(unsignedlong)18919寫成18919L確實(shí)沒問題,但不知道其它是否也有如此簡(jiǎn)寫:
如:,(unsignedint)189等
網(wǎng)友評(píng)論:一個(gè)A人的說法~~~
網(wǎng)友評(píng)論:有哪位能給鄙人推薦一本好的C51方面的書啊
網(wǎng)友評(píng)論:所長(zhǎng)的程序?qū)Γ蔷冉档土恕?br>
網(wǎng)友評(píng)論:我記得我也做過這樣的事情,不過沒關(guān)心什么,用double就行了,當(dāng)然程序是長(zhǎng)了點(diǎn),資源也占多點(diǎn),但我精度有了保證。
網(wǎng)友評(píng)論:同意擴(kuò)展數(shù)據(jù)類型的長(zhǎng)度
我記得我也做過這樣的事情,不過沒關(guān)心什么,用double就行了,當(dāng)然程序是長(zhǎng)了點(diǎn),資源也占多點(diǎn),但我精度有了保證。
對(duì)數(shù)據(jù)類型的定義應(yīng)該還是滿足要求就行,如這個(gè)問題,產(chǎn)品需要的精度為小于等于0.1%,所以就只需轉(zhuǎn)成LONGINT就行了,計(jì)算也不會(huì)產(chǎn)生溢出錯(cuò)誤
網(wǎng)友評(píng)論:我在程序內(nèi)從未用過小數(shù),為我覺得一切小數(shù)在單片機(jī)里都是以二進(jìn)制整數(shù)來實(shí)現(xiàn)的,不知各位的理解。
網(wǎng)友評(píng)論:65536L-18919L*(T_Pimp-time_cnt)/time_cnt
=65536-18919L*(T_Pimp-time_cnt)/time_cnt
網(wǎng)友評(píng)論:大家就頂頂吧
網(wǎng)友評(píng)論:頂一下吧
網(wǎng)友評(píng)論:因?yàn)镃51的編譯器默然的整型為16位,所以對(duì)于小于32768的數(shù)就會(huì)認(rèn)為是整型,做16位的運(yùn)算,
對(duì)于運(yùn)算結(jié)果超出16位的,就被截?cái)嗔恕H绻\(yùn)算結(jié)果最高位為1的,還要進(jìn)行符號(hào)擴(kuò)展,例如
如果你寫的是j=20000*2;,結(jié)果就是0xFFFF9C40了。對(duì)于大于等于32768的數(shù),就會(huì)先自動(dòng)擴(kuò)展為
longint型,然后再運(yùn)算,這時(shí)結(jié)果就不會(huì)出錯(cuò)了,為了安全起見,不管它多大,還是明確指定為好:
j=20000L*4;
j=20000L*2;
j=65535L*4;
如果你換成keilCARM,就不會(huì)存在這個(gè)問題了,因?yàn)锳RM是32位的,int就是32位的。
網(wǎng)友評(píng)論:你的解釋我再驗(yàn)證下,不過先感謝你了.
網(wǎng)友評(píng)論:保留整數(shù),省掉小數(shù).
網(wǎng)友評(píng)論:飄過
網(wǎng)友評(píng)論:8位的類似89C52
網(wǎng)友評(píng)論:應(yīng)該是溢出。
網(wǎng)友評(píng)論:PHA_adj=84455-(unsignedlong)18918*T_Pimg/time_cnt;
網(wǎng)友評(píng)論:要建立“數(shù)值與類型相互獨(dú)立”的概念
常數(shù)是有類型的,某些數(shù)值有默認(rèn)類型,那只能當(dāng)作特例
數(shù)學(xué)等價(jià)變換:
65536-18919*(T_Pimp-time_cnt)/time_cnt
=65536-(18919*(T_Pimp/time_cnt-1))
=65536-(18919*(T_Pimp/time_cnt)-18919)
=84455-18919*(T_Pimp/time_cnt)
C語(yǔ)言表達(dá)式:
84455uL-(18919uL*T_Pimp)/time_cnt
網(wǎng)友評(píng)論:PHA_adj=65536-(unsignedlong)(18919*(T_Pimp-time_cnt))/(unsignedlong)time_cnt;
網(wǎng)友評(píng)論:PHA_adj=65536-((unsignedlong)18919*(T_Pimp-time_cnt))/(unsignedlong)time_cnt;
對(duì)有的編譯器,17樓的能過。
網(wǎng)友評(píng)論:應(yīng)該是對(duì)所有編譯器17樓都能過吧
網(wǎng)友評(píng)論:對(duì)于32位變量和16位變量的運(yùn)算,如果不強(qiáng)制類型轉(zhuǎn)換有的向16位看齊,有的向32位看齊,我的印象是IARforMSP430向16位看齊,而IARforARM卻向32位看齊,是不是對(duì)于片內(nèi)RAM資源少的傾向節(jié)省RAM,而對(duì)片內(nèi)RAM資源多的傾向浪費(fèi)RAM,也許是由IAR的配置確定。16位變量和8位變量的運(yùn)算也是這樣
網(wǎng)友評(píng)論:我只看到了譚浩強(qiáng)老師書上說的,不同數(shù)據(jù)類型之間的混合運(yùn)算,都是短字節(jié)數(shù)向長(zhǎng)字節(jié)數(shù)對(duì)齊.
網(wǎng)友評(píng)論:譚浩強(qiáng)老師書上說的曾讓我困惑了很久,這個(gè)世界沒有絕對(duì)的權(quán)威。
網(wǎng)友評(píng)論:是的他的書有些寫得也不全面,不過他的書還是寫得很好的.
網(wǎng)友評(píng)論:aa
網(wǎng)友評(píng)論:qqqqqqqqqqqqqq
網(wǎng)友評(píng)論:unsignedlongsum;
sum=T_Pimp-time_cnt;
sum=18919*sum;
sum=sum/time_cnt;
PHA_adj=65536-(unsignedint)sum;
網(wǎng)友評(píng)論:樓上的方法也可以啰不過這樣寫有點(diǎn)麻煩.
網(wǎng)友評(píng)論:PHA_adj=(unsignedint)(65536-18919.0*(T_Pimp-time_cnt)/(1.0*time_cnt));
先做成浮點(diǎn)數(shù),再轉(zhuǎn)換為int
網(wǎng)友評(píng)論:樓上的你的結(jié)果沒錯(cuò),但不是最好的處理辦法.
網(wǎng)友評(píng)論:18919.0的出現(xiàn),乘法就變成了浮點(diǎn)數(shù)乘法,代碼增加不少.
網(wǎng)友評(píng)論:如果實(shí)在32系統(tǒng)里,這個(gè)公式是不會(huì)溢出的,但如果在int為16位的系統(tǒng)里,這個(gè)公式確實(shí)會(huì)溢出。還有你也沒有說清楚要求的精度要求,當(dāng)精度要求比較高時(shí),該公式必須轉(zhuǎn)換成浮點(diǎn)類型進(jìn)行計(jì)算
網(wǎng)友評(píng)論:在KEIL的C51編譯unsignedint最大0XFFFF
18919*(T_Pimp-time_cnt)一定溢出了,
但ARM中unsignedint最大0XFFFFFFFF,結(jié)果沒問題
網(wǎng)友評(píng)論:我的是8位的MCU呢相當(dāng)于80C52.
網(wǎng)友評(píng)論:不過,樓主的問題有點(diǎn)小兒科了。
類似程序編譯驗(yàn)證一下,馬上可以得出結(jié)果正確與否。
這問題拿不出臺(tái)面的,不用分享了。
網(wǎng)友評(píng)論:我問了下用C做了幾年產(chǎn)品的同事,他居然還找不到BUG,呵呵,我的目的是讓新手增加點(diǎn)經(jīng)驗(yàn).
網(wǎng)友評(píng)論:如果換編譯器,這些數(shù)學(xué)計(jì)算還是要重新確認(rèn)一次.
另外,還是要注意邊界測(cè)算.我的方法也是數(shù)據(jù)擴(kuò)展,但絕對(duì)不轉(zhuǎn)浮點(diǎn)。
網(wǎng)友評(píng)論:畢業(yè)后二十年了,總算接了個(gè)大工程,造一根三十米煙囪,工期兩個(gè)月,造價(jià)三十萬(wàn),不過要墊資。總算在上個(gè)月底搞完了。今天人家去驗(yàn)收,被人罵得要死,還沒有錢拿。媽的!圖紙看反了,人家是要挖一口井!
網(wǎng)友評(píng)論:還是把整型寫明白好,2字節(jié)的就定義成短整型,4字節(jié)的就定義成長(zhǎng)整型,勉得各個(gè)系統(tǒng)不一樣.
網(wǎng)友評(píng)論:如果不是就事論事,光一個(gè)式子,哪有錯(cuò)對(duì)可論的。
所謂錯(cuò)者,指那個(gè)結(jié)果與期望的不一致。樓主得先給一個(gè)樣品值與使用環(huán)境,才能評(píng)論錯(cuò)那里了。
網(wǎng)友評(píng)論:答案前面已經(jīng)有人說了啊