0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在單片機(jī)上實(shí)現(xiàn)開根號(hào)

Wildesbeast ? 來(lái)源:網(wǎng)絡(luò)整理 ? 作者:佚名 ? 2020-01-19 11:02 ? 次閱讀

單片機(jī)開平方的快速算法

因?yàn)楣ぷ鞯男枰趩纹瑱C(jī)上實(shí)現(xiàn)開根號(hào)的操作。目前開平方的方法大部分是用牛頓迭代法。我在查了一些資料以后找到了一個(gè)比牛頓迭代法更加快速的方法。不敢獨(dú)享,介紹給大家,希望會(huì)有些幫助。

1.原理

因?yàn)榕虐娴脑?,用pow(X,Y)表示X的Y次冪,用B[0],B[1],。..,B[m-1]表示一個(gè)序列,

其中[x]為下標(biāo)。

假設(shè):

B[x],b[x]都是二進(jìn)制序列,取值0或1。

M = B[m-1]*pow(2,m-1) + B[m-2]*pow(2,m-2) + 。.. + B[1]*pow(2,1) + B[0]*pow

(2,0)

N = b[n-1]*pow(2,n-1) + b[n-2]*pow(2,n-2) + 。.. + b[1]*pow(2,1) + n[0]*pow

(2,0)

pow(N,2) = M

(1) N的最高位b[n-1]可以根據(jù)M的最高位B[m-1]直接求得。

設(shè) m 已知,因?yàn)?pow(2, m-1) 《= M 《= pow(2, m),所以 pow(2, (m-1)/2) 《= N 《=

pow(2, m/2)

如果 m 是奇數(shù),設(shè)m=2*k+1,

那么 pow(2,k) 《= N 《 pow(2, 1/2+k) 《 pow(2, k+1),

n-1=k, n=k+1=(m+1)/2

如果 m 是偶數(shù),設(shè)m=2k,

那么 pow(2,k) 》 N 》= pow(2, k-1/2) 》 pow(2, k-1),

n-1=k-1,n=k=m/2

所以b[n-1]完全由B[m-1]決定。

余數(shù) M[1] = M - b[n-1]*pow(2, 2*n-2)

(2) N的次高位b[n-2]可以采用試探法來(lái)確定。

因?yàn)閎[n-1]=1,假設(shè)b[n-2]=1,則 pow(b[n-1]*pow(2,n-1) + b[n-1]*pow(2,n-2),

2) = b[n-1]*pow(2,2*n-2) + (b[n-1]*pow(2,2*n-2) + b[n-2]*pow(2,2*n-4)),

然后比較余數(shù)M[1]是否大于等于 (pow(2,2)*b[n-1] + b[n-2]) * pow(2,2*n-4)。這種

比較只須根據(jù)B[m-1]、B[m-2]、。..、B[2*n-4]便可做出判斷,其余低位不做比較。

若 M[1] 》= (pow(2,2)*b[n-1] + b[n-2]) * pow(2,2*n-4), 則假設(shè)有效,b[n-2] =

1;

余數(shù) M[2] = M[1] - pow(pow(2,n-1)*b[n-1] + pow(2,n-2)*b[n-2], 2) = M[1] -

(pow(2,2)+1)*pow(2,2*n-4);

若 M[1] 《 (pow(2,2)*b[n-1] + b[n-2]) * pow(2,2*n-4), 則假設(shè)無(wú)效,b[n-2] =

0;余數(shù) M[2] = M[1]。

(3) 同理,可以從高位到低位逐位求出M的平方根N的各位。

使用這種算法計(jì)算32位數(shù)的平方根時(shí)最多只須比較16次,而且每次比較時(shí)不必把M的各位逐

一比較,尤其是開始時(shí)比較的位數(shù)很少,所以消耗的時(shí)間遠(yuǎn)低于牛頓迭代法。

2. 流程圖

(制作中,稍候再上)

3. 實(shí)現(xiàn)代碼

這里給出實(shí)現(xiàn)32位無(wú)符號(hào)整數(shù)開方得到16位無(wú)符號(hào)整數(shù)的C語(yǔ)言代碼。

-------------------------------------------------------------------------------

-

/****************************************/

/*Function: 開根號(hào)處理 */

/*入口參數(shù):被開方數(shù),長(zhǎng)整型 */

/*出口參數(shù):開方結(jié)果,整型 */

/****************************************/

unsigned int sqrt_16(unsigned long M)

{

unsigned int N, i;

unsigned long tmp, ttp; // 結(jié)果、循環(huán)計(jì)數(shù)

if (M == 0) // 被開方數(shù),開方結(jié)果也為0

return 0;

N = 0;

tmp = (M 》》 30); // 獲取最高位:B[m-1]

M 《《= 2;

if (tmp 》 1) // 最高位為1

{

N ++; // 結(jié)果當(dāng)前位為1,否則為默認(rèn)的0

tmp -= N;

}

for (i=15; i》0; i--) // 求剩余的15位

{

N 《《= 1; // 左移一位

tmp 《《= 2;

tmp += (M 》》 30); // 假設(shè)

ttp = N;

ttp = (ttp《《1)+1;

M 《《= 2;

if (tmp 》= ttp) // 假設(shè)成立

{

tmp -= ttp;

N ++;

}

}

return N;

}
責(zé)任編輯 LK

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6037

    文章

    44558

    瀏覽量

    635285
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4612

    瀏覽量

    92890
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    單片機(jī)能處理帶根號(hào)的公式么?如何去除公式的根號(hào)?

    單片機(jī)能處理帶根號(hào)的公式么?誤差是不是會(huì)比較大?有沒有什么辦法去除公式的根號(hào)?或者減少單片機(jī)計(jì)算的誤差
    發(fā)表于 07-08 17:12

    單片機(jī)如何做根號(hào)運(yùn)算?

    我要用單片機(jī)測(cè)交流有效值,需要根號(hào)單片機(jī)可以直接做根號(hào)運(yùn)算嗎?
    發(fā)表于 09-25 23:11

    【MCU每周論點(diǎn)】吳鑒鷹帶你根號(hào),單片機(jī)跑的更快

    一份。 大家知道因?yàn)楣ぷ鞯男枰?,要?b class='flag-5'>單片機(jī)上實(shí)現(xiàn)根號(hào)的操作。目前工程師開平方的方法大部分是用牛頓迭代法。吳鑒鷹在查了一些資料以后找到了一個(gè)比牛頓迭代法更加快速的方法。不敢獨(dú)享,介紹
    發(fā)表于 03-03 19:06

    單片機(jī)根號(hào)的快速算法

    因?yàn)楣ぷ鞯男枰?b class='flag-5'>單片機(jī)上實(shí)現(xiàn)根號(hào)的操作。目前開平方的方法大部分是用牛頓迭代法。我在查了一些資料以后找到了一個(gè)比牛頓迭代法更加快速的方法。不敢獨(dú)享,介紹給大家,希望會(huì)有些幫助。1.
    發(fā)表于 04-10 07:00

    何在單片機(jī)上使用c++?

    何在單片機(jī)上使用c++?
    發(fā)表于 10-08 06:38

    代碼是如何在單片機(jī)上跑的呢

    淺談:對(duì)于任何電子產(chǎn)品,硬件是軟件運(yùn)行的基礎(chǔ),而軟件賦予了硬件靈魂,兩者有機(jī)結(jié)合成為一個(gè)功能豐富、強(qiáng)大的系統(tǒng)。我們寫的代碼是如何在單片機(jī)上跑的呢?下面以比較簡(jiǎn)單的方式簡(jiǎn)述一下,如果還要研究很多細(xì)節(jié)
    發(fā)表于 11-17 07:47

    何在STM32單片機(jī)上實(shí)現(xiàn)Printf函數(shù)打印串口信息并進(jìn)行代碼調(diào)試?

    何在STM32單片機(jī)上實(shí)現(xiàn)Printf函數(shù)打印串口信息并進(jìn)行代碼調(diào)試?
    發(fā)表于 12-02 07:35

    單片機(jī)上實(shí)現(xiàn)FTP

    何在單片機(jī)上實(shí)現(xiàn)FTP文件上傳這篇文章是我本人編寫的 在網(wǎng)上也是絕無(wú)僅有一開始發(fā)表在我的網(wǎng)易博客上了 結(jié)果被轉(zhuǎn)移且被誤傷 有可能存在某些字符或文字出錯(cuò)的地方有時(shí)間我會(huì)重新編寫, 目前大家先看
    發(fā)表于 01-07 06:53

    何在單片機(jī)上使用TEA加密通信源代碼免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是如何在單片機(jī)上使用TEA加密通信源代碼免費(fèi)下載。
    發(fā)表于 07-19 17:37 ?2次下載
    如<b class='flag-5'>何在</b><b class='flag-5'>單片機(jī)上</b>使用TEA加密通信源代碼免費(fèi)下載

    何在51單片機(jī)上使用DS1302

    本文檔的主要內(nèi)容詳細(xì)介紹的是如何在51單片機(jī)上使用DS1302。
    發(fā)表于 07-17 17:38 ?5次下載
    如<b class='flag-5'>何在</b>51<b class='flag-5'>單片機(jī)上</b>使用DS1302

    何在2KB內(nèi)存的單片機(jī)上實(shí)現(xiàn)俄羅斯方塊

    本文檔的主要內(nèi)容詳細(xì)介紹的是如何在2KB內(nèi)存的單片機(jī)上實(shí)現(xiàn)俄羅斯方塊。
    發(fā)表于 06-04 17:52 ?1次下載

    何在單片機(jī)上實(shí)現(xiàn)卡爾曼濾波詳細(xì)計(jì)算方法和程序概述

    本文檔的主要內(nèi)容詳細(xì)介紹的是如何在單片機(jī)上實(shí)現(xiàn)卡爾曼濾波詳細(xì)計(jì)算方法和程序概述。
    的頭像 發(fā)表于 08-11 11:23 ?1.3w次閱讀
    如<b class='flag-5'>何在</b><b class='flag-5'>單片機(jī)上</b><b class='flag-5'>實(shí)現(xiàn)</b>卡爾曼濾波詳細(xì)計(jì)算方法和程序概述

    何在51單片機(jī)上實(shí)現(xiàn)串口收發(fā)命令

    串口通信在電子行業(yè)中應(yīng)用較廣,通過上位機(jī)發(fā)送命令,實(shí)現(xiàn)各種功能的控制及數(shù)據(jù)的反饋。本文就是在51 單片機(jī)上實(shí)現(xiàn)串口收發(fā)命令,程序調(diào)試正常,可以運(yùn)用到控制系統(tǒng)中。
    發(fā)表于 11-26 17:02 ?12次下載

    單片機(jī)】代碼是如何在單片機(jī)上運(yùn)行起來(lái)的?

    淺談:對(duì)于任何電子產(chǎn)品,硬件是軟件運(yùn)行的基礎(chǔ),而軟件賦予了硬件靈魂,兩者有機(jī)結(jié)合成為一個(gè)功能豐富、強(qiáng)大的系統(tǒng)。我們寫的代碼是如何在單片機(jī)上跑的呢?下面以比較簡(jiǎn)單的方式簡(jiǎn)述一下,如果還要研究很多細(xì)節(jié)
    發(fā)表于 11-10 19:20 ?3次下載
    【<b class='flag-5'>單片機(jī)</b>】代碼是如<b class='flag-5'>何在</b><b class='flag-5'>單片機(jī)上</b>運(yùn)行起來(lái)的?

    單片機(jī)上如何實(shí)現(xiàn)快速的開方運(yùn)算

    最近,做項(xiàng)目時(shí),需要使用開發(fā)運(yùn)算,但是調(diào)用標(biāo)準(zhǔn)c庫(kù)的sqrt函數(shù),發(fā)現(xiàn)該函數(shù)有2k多大小,當(dāng)然執(zhí)行時(shí)間也就很長(zhǎng)了,根本不適合單片機(jī)的運(yùn)算。故而,網(wǎng)上找了一個(gè)簡(jiǎn)化的算法,編譯出來(lái)后,只有不到100字節(jié)
    發(fā)表于 11-16 15:51 ?7次下載
    <b class='flag-5'>單片機(jī)上</b>如何<b class='flag-5'>實(shí)現(xiàn)</b>快速的開方運(yùn)算