|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
如何用51快速實現(xiàn)下面計算 |
| 作者:newliujian 欄目:單片機 |
收到X,經(jīng)計算后要發(fā)出去. X:32Bit的數(shù)據(jù),uchar x[4],4次接收完成 Y = 2^32 * X / 10^8 Y:32Bit的數(shù)據(jù),想弄成uchar y[4],然后發(fā)開算, 再發(fā)出去,不知道行不行?但是2^32這個數(shù)太大了,不好弄啊.... 有沒有什么好點的方法,可以快點算出來? |
| 2樓: | >>參與討論 |
| 作者: 汽車電子 于 2006/7/24 16:23:00 發(fā)布:
2^32用左移 10^8不好搞 |
|
| 3樓: | >>參與討論 |
| 作者: computer00 于 2006/7/24 16:55:00 發(fā)布:
直接寫Y=43*X不行嗎? |
|
| 4樓: | >>參與討論 |
| 作者: rtfsc 于 2006/7/24 17:17:00 發(fā)布:
那要看“/”是啥 |
|
| 5樓: | >>參與討論 |
| 作者: conwh 于 2006/7/24 17:48:00 發(fā)布:
10^8=5F5E100H 將5F5E1帶進公式進行運算,在計算結(jié)果里減掉一個字節(jié) |
|
| 6樓: | >>參與討論 |
| 作者: conwh 于 2006/7/24 18:10:00 發(fā)布:
re 直接寫Y=43*X不行嗎? 可能嫌精度不夠 |
|
| 7樓: | >>參與討論 |
| 作者: xwj 于 2006/7/24 18:15:00 發(fā)布:
Y=43*X-X/((10^8)/5032704) Y=43*X-X/((10^8)/5032704) =43*X-X/19.87 自己根據(jù)精度取舍 * - 本貼最后修改時間:2006-7-28 7:42:52 修改者:xwj |
|
| 8樓: | >>參與討論 |
| 作者: newliujian 于 2006/7/25 11:19:00 發(fā)布:
re: 先謝謝各位的幫助. 這里就是對精度要求很高. 汽車電子: 左移32為的話,怎么定義數(shù)據(jù)類型? xwj: X,Y都是32位,但中間的 0x2b*X 會不會益出而導(dǎo)致結(jié)果的誤差? 且X不是一個定植,好象不能直接減吧? * - 本貼最后修改時間:2006-7-25 14:08:53 修改者:newliujian |
|
| 9樓: | >>參與討論 |
| 作者: 農(nóng)民講習(xí)所 于 2006/7/25 11:50:00 發(fā)布:
不先設(shè)定X的數(shù)值范圍,實現(xiàn)不了。 X最大是多少? |
|
| 10樓: | >>參與討論 |
| 作者: newliujian 于 2006/7/25 11:58:00 發(fā)布:
X最大是 90,000,000---90M 我X是用的ulong ; 通過x得到的;uchar x[4], x為從P口得到的數(shù)據(jù) X |= x[3]; X = X<<8; X |= x[2]; ... ... X |=x[0]; 方法比較笨吧 |
|
| 11樓: | >>參與討論 |
| 作者: good02xaut 于 2006/7/26 9:50:00 發(fā)布:
re Y = 2^32 * X / 10^8=Y = 2^24 * X / 5^8 建立表格: ****************************************** 商 余數(shù) T31=2^31/5^8 DEL31=2^31%5^8 T30=2^30/5^8 DEL30=2^30%5^8 ... Tn=2^n/5^8 DELn=2^n%5^8 .... T0=2^0/5^8 DEL0=2^0%5^8 ****************************************** { Y=0; DELT=0; X<<=24; if(X&mask31) Y+=T31,DELT+=DEL31; else ; .................. if(X&mask0) Y+=T0,DELT+=DEL0; else ; } { X=DELT; if(X&mask31) Y+=T31,DELT+=DEL31; else ; ...... } ...... if(X<5^8) STOP! |
|
| 12樓: | >>參與討論 |
| 作者: angelcmq 于 2006/7/26 10:38:00 發(fā)布:
re 精度不夠吧! |
|
| 13樓: | >>參與討論 |
| 作者: newliujian 于 2006/7/27 16:07:00 發(fā)布:
沒有看很懂 PS: 因為X最大是 90,000,000---90M, 我忘了說最小值,最小是10,000,000---10M. 步進是2... ------------------------------------------- 因為有了 X<<=24; 那X因該定義成什么類型才不會出錯呢? |
|
| 14樓: | >>參與討論 |
| 作者: computer00 于 2006/7/27 16:17:00 發(fā)布:
keil51中沒有那么長的整數(shù)類型。 樓主你那樣寫,最后的結(jié)果還是一樣的,因為編譯器會將2^32/10^8當(dāng)作整數(shù)來處理,即43,而不是浮點數(shù)。 改成浮點數(shù),才能達到那么大的范圍。并且最多只能有7位精度。 |
|
| 15樓: | >>參與討論 |
| 作者: IceAge 于 2006/7/27 20:42:00 發(fā)布:
找一個 32 * 32 的函數(shù),這類 function 到處都有 2^32 * 10^8 = 42.94967296 42.94967296 * 2^24 = 720575940.37927936 取 X * 720575940 64bit結(jié)果的 56bit --- 24bit |
|
| 16樓: | >>參與討論 |
| 作者: conwh 于 2006/7/27 21:09:00 發(fā)布:
用匯編還是簡單一點,位數(shù)自由確定 最大數(shù)和最小數(shù)是9倍的關(guān)系,精度是保留整數(shù),就采用先約分再計算 |
|
| 17樓: | >>參與討論 |
| 作者: newliujian 于 2006/7/28 14:39:00 發(fā)布:
先謝謝各位的意見 Re: IceAge 那我看看有沒有再回 Re: computer00 我也是想到?jīng)]有這個類型才提出的這個問題。也是這樣,才想知道大家有沒有好的方法。 Re: conwh 用匯編,不好意思,我目前這個能力還很差,能不能提細一點 |
|
| 18樓: | >>參與討論 |
| 作者: kfawj 于 2006/7/28 17:02:00 發(fā)布:
除法就是右移 好好看看右移指令,應(yīng)該沒有問題。 |
|
| 19樓: | >>參與討論 |
| 作者: 王紫豪 于 2006/7/28 18:04:00 發(fā)布:
推薦用各小arm,整的塊!要不就查表! |
|
| 20樓: | >>參與討論 |
| 作者: conwh 于 2006/7/29 0:11:00 發(fā)布:
用匯編只要存儲器夠用多少位都可計算 一點提示: 乘法就是做移位加法 除法就是移位減法,不夠減的再移位并恢復(fù)原數(shù).如果需要來信奉獻一段.conwh@yeah.net |
|
| 21樓: | >>參與討論 |
| 作者: good02xaut 于 2006/7/29 16:15:00 發(fā)布:
數(shù)據(jù)類型可以靈活設(shè)置 編譯器支持,就用內(nèi)置的,比如double。 不支持,那就自己定義一個struct。 解決問題的核心是理解除法的本質(zhì),如何精確得到商和余數(shù)! 要求速度,必須提供先知數(shù)據(jù),減少CPU的運算,建立查找表。 而且要根據(jù)累加器的位寬,對表項合理劃分! |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |