兩種逐次逼近的開平方演算法sqrt

2021-10-05 22:08:25 字數 1692 閱讀 1958

此處兩種演算法優勢:通過移位、或運算 完成平方值的比較,無需乘法器。

1、方法一

根據被開方數字寬,從結果的最到位[ (asize/2)-1]到最低位[0]逐次逼近。核心**理解:

tt = (v << (i + 1)) | (1 << (i + i))=2*v*2^i  +  2^(2*i) = (v+2^i)^2 - v^2;//  | 相當於加法。

v+2^i表示結果v的第[i]bit 新變為1,則tt代表v[i]=1後,v^2的增量。

每次變位完,需要從被開方總數r-增量tt,剩餘值繼續用於判斷後續bit變位。

parameter asize = 52;//輸入資料位寬

input [asize-1:0] a;

output reg [(asize/2)-1:0] z;

reg [asize-1:0] v, r, tt;

always @(a) begin //此段**只適用於**,無法綜合

integer i;

// r is remainder,

// tt 增加1個bit後平方值的增量

// v is current sqrt value

v = 0;

r = a;

for(i = asize/2 - 1; i >= 0; i = i - 1) begin//i迴圈0~25

tt = (v << (i + 1)) | (1 << (i + i));

if(tt <= r) begin

v = v | (1 << i);//v的對應位置1

r = r - tt;

endend

z = v;

end

2、方法二

被開方數ai為32位,結果位寬[15:0],ai[15]=1時平方值=32'h4000_0000=2^30=(2^15)*(2^15),右移15位又得到ai[15]=1。

按照每位的平方值m逐次逼近,每次m>>2,直到m>0

parameter m_s = 32'h4000_0000;

parameter a_s = 32'd1000;

reg [31:0] y = 0;

reg [31:0] b,result;//開方結果

reg [31:0] t;

reg [31:0] m = m_s;

reg [31:0] ai= a_s;//ai為輸入的32bits 資料

always @(posedge clk) begin

if (m>0) m <= m>>2;

else

result <= ( (y !=65535 ) && (a_s > (y*y+y)) ) ? y+1 :y;//做捨入判斷 +1

endalways @( * ) begin //此段**只適用於**,無法綜合

if(m>0) begin

b = y | m;//最新平方和 的累加

y = y>>1; //平方和通過每次移位,縮小為開方值

t = (ai>b) ? 32'hffff_ffff : 32'h0000_0000 ;//ai>b 表示當前bit有效為1

ai = ai - (b & t);//平方和 的剩餘未分解值

y = y | (m & t);//相當於有效平方和 的累加

endend

快速開平方取倒數的演算法

quake iii arena 雷神之鎚3 是90年代的經典遊戲之一。該系列的遊戲不但畫面和內容不錯,而且即使計算機配置低,也能極其流暢地執行。這要歸功於它3d引擎的開發者約翰 卡馬克 john carmack 事實上早在90年代初dos時代,只要能在pc上搞個小動畫都能讓人驚嘆一番的時候,john...

ACM 反覆平方法的兩種寫法

一直以來對反覆平方法都是知道個大概意思,但是一直都處於混淆的狀態,今天總結一下。網上通常看到的 是這個樣子的 1 int pow int a,int b 8 r r 9 b 2 10 11return result 12 假設b為1011的話,列出來b運算過的部分 result r的結果是 b運算過...

組合的兩種遞迴演算法

組合就是從n個物品中任意選擇m個組成一組,下面兩種遞迴演算法都可以求出不同的組合,如果待選物品當中有重複的,比如說下面 中an new char 變成 an new char,這兩種演算法依然有效,只不過要加一步去重複。tip 如果給出的陣列元素不是數字,比如是a,b,c,d,可以直接用陣列下標來進...