我需要为泛型浮点格式实现一个数字递归平方根,这样exp_size+mant_size+1我基本上遵循了这里建议的实现
handbook of floating point arithmetic在浮点运算器的软件实现中。
我试过测试我的实现(不是一个详尽的测试),基本上对于32位这样的格式,它看起来工作得很好,而对于尾数=10这样的格式,对于输入x=0.25,指数=5而不是给我0.5,它给了我0.707031。
所以我在想,对于小格式,数字递归方法是否有一些限制,或者…只是我的执行不好…
我希望你能帮助我…从0开始实现这些东西很痛苦…
最佳答案
查看代码非常困难,但您应该:
测试所有操作数组合
如果它只适用于一个例子并不意味着它适用于所有人
检查位掩码
你用32位的时候写的结果很好
使用10时,则不使用
这暗示着某处会溢出
你确定你有为R保留/屏蔽的正确位计数吗?
R应该比Q多2位(精度为1位,符号为+1位)
你也应该把R当作两个补语来处理
q是d位的一半,无符号
找不到你的算法(你链接的那本书不允许我再读第265页,在这里SqRT开始可能是一些不兼容性我用好的老歌剧)但是这是我在谷歌(非恢复SqRT)中发现的最接近的一个在FPGA上的一些PDF研究和HW实现以及在清除bug和测试之后这就是我在C++中的代码。测试:
DWORD u32_sqrt(DWORD D) // 32bit
{
const int _bits =32;
const DWORD _R_mask=(4<<(_bits>>1))-1;
const DWORD _R_sign= 2<<(_bits>>1);
DWORD Q=0; // u(_bits/2 ) result (quotient)
DWORD R=0; // i(_bits/2 + 2) 2os complement (remainder) R=D-Q*Q
for (int i=_bits-2;i>=0;i-=2)
{
if (DWORD(R&_R_sign)){ R=(R<<2)|((D>>i)&3); R+=(Q<<2)|3; } // R< 0
else { R=(R<<2)|((D>>i)&3); R-=(Q<<2)|1; } // R>=0
R&=_R_mask; Q<<=1; if (!DWORD(R&_R_sign)) Q|=1; // R>=0
}
return Q;
}